<?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=Feldweg</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=Feldweg"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Feldweg"/>
	<updated>2026-04-21T08:54:53Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=65373</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=65373"/>
		<updated>2012-03-30T22:52:15Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Übersicht.jpg|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:Schaltplan ultra.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Board layout ultra.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung2.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan ultra.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hardwarebeschreibungssprache VHDL==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.20 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company:                             FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer:                      Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:                         2011-06-28&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:                         ultraschall_1.1 &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description:             Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--                          wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
   Port (  clk :                         IN  std_logic;&lt;br /&gt;
           stopp :                       IN  std_logic;&lt;br /&gt;
           ultraschall :                 OUT  std_logic;&lt;br /&gt;
           lampe :                       OUT  std_logic;&lt;br /&gt;
           seg1 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg2 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg3 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg4 :                        out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal wegzaehler1 :                     STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal senderein :                       STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ultra :                           STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal einaus:                           STD_LOGIC_VECTOR (3 downto 0) :=&amp;quot;0000&amp;quot;;&lt;br /&gt;
signal startzaehler :                    STD_LOGIC_VECTOR (10 downto 0) :=&amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 :                            STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm :                          STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal mm:                               STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag:                             STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lampe &amp;lt;= not stopp;&lt;br /&gt;
ultraschall &amp;lt;=  einaus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk)                              --Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
&lt;br /&gt;
    clk2 &amp;lt;= clk2+1;                         --clk2 Zähl-Periode jetzt auf 50MHz	 &lt;br /&gt;
    if (clk2=728) then                      --auf 5mm einstellen: 0,005m * 50e6 Hz/ (343 m/s) = 729&lt;br /&gt;
        &lt;br /&gt;
        clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;             --doppelter Laufweg noch nicht berücksichtigt&lt;br /&gt;
&lt;br /&gt;
    end if;                                 --und 1011011000=728 weil er von 0 anfängt zu zählen&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )	                            --Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if einaus &amp;gt;= 14 then                    --14 da HIGH und LOW gezählt werden&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
			&lt;br /&gt;
    &lt;br /&gt;
    if clk2 = 728 then&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= startzaehler+1;     --Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=2047) then  --Periode der Messung (ca 30ms)&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (senderein = &#039;1&#039; ) then&lt;br /&gt;
&lt;br /&gt;
        ultra &amp;lt;= ultra+1;&lt;br /&gt;
&lt;br /&gt;
        if (ultra=625) then            -- 50MHz/40kHz/2= 625 Takte [2mal wegen ein/aus für Ultraschallkapsel 40kHz]&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= einaus + 1;      -- hier auch wirklich 625 Takte, weil er danach sofort eins dazuzählt&lt;br /&gt;
&lt;br /&gt;
            ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
        if einaus = 14 then            -- Rücksetzten&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=8) then           -- setzt alle ~30ms Zähler auf 0 zurück,1110 zusätzlich Trägheitsausgleich der Senderkapsel (offset)&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;      -- muss angepasst werden auf die jeweilige Spannung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (clk2 = 0) then                 -- erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= fivemm + 1;	       -- eigentliche Wegzählung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
		&lt;br /&gt;
    if (senderein=&#039;1&#039;) then            -- Bereit machen für Wertänderung&lt;br /&gt;
&lt;br /&gt;
        flag &amp;lt;= &#039;1&#039;;                   -- zeigt das Ultraschallimpuls unterwegs ist&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then                            --Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
        if (fivemm(10 downto 2) &amp;lt; 500) then                      -- Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
            if (fivemm(10 downto 2) &amp;gt; 2) then                    -- Zu nah dran -&amp;gt; alter Wert bleibt&lt;br /&gt;
                wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);  -- geteilt durch 2 wegen hin/zurück und 5mm extra&lt;br /&gt;
                mm &amp;lt;= fivemm(1);                                 -- 5mm&lt;br /&gt;
 &lt;br /&gt;
               wegzaehler1(9) &amp;lt;=&#039;0&#039;;&lt;br /&gt;
                flag &amp;lt;= &#039;0&#039;;                                     -- Impuls angekommen&lt;br /&gt;
            end if;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (fivemm=4095) then&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
        wegzaehler1(8 downto 0) &amp;lt;=&amp;quot;111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;			&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler2 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler3 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable m , dm , cm :    STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
cm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Meterberechnung&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 399) and (wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2:= wegzaehler1 - 400;		&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299) and (wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 300;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199) and (wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 200;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99) and (wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 100;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1;&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
    wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Dezimeterberechnung&lt;br /&gt;
if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -90;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -80;&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -70;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -60;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -50;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -40;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -30;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -20;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -10;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2;&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
    dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Zentimeterberechnung&lt;br /&gt;
if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    cm := wegzaehler3(3 downto 0);&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Millimeterberechnung				&lt;br /&gt;
CASE mm IS&lt;br /&gt;
    WHEN &#039;0&#039;    =&amp;gt; seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
&lt;br /&gt;
if (cm=&amp;quot;1111&amp;quot;) then   --falls Falscher Wert mm auf nichts&lt;br /&gt;
    seg4 &amp;lt;=&amp;quot;00000000&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
				&lt;br /&gt;
CASE cm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;		&lt;br /&gt;
END CASE;&lt;br /&gt;
		  &lt;br /&gt;
CASE dm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;&lt;br /&gt;
			&lt;br /&gt;
CASE m IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pinbelegung====&lt;br /&gt;
&lt;br /&gt;
[[Bild:Anschluss FPGA.jpg|right|miniatur| Abb.21 Anschluss am FPGA-Board ]]&lt;br /&gt;
[[Bild:Anschluss Signalverarbeitung.jpg|right|miniatur| Abb.22 Anschluss an der Signalverarbeitung ]]&lt;br /&gt;
&lt;br /&gt;
NET &amp;quot;clk&amp;quot;     LOC = AA12;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[0]&amp;quot; LOC = E15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[1]&amp;quot; LOC = E16;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[2]&amp;quot; LOC = A14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[3]&amp;quot; LOC = D14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[4]&amp;quot; LOC = D13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[5]&amp;quot; LOC = B13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[6]&amp;quot; LOC = E13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[7]&amp;quot; LOC = D15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[0]&amp;quot; LOC = B17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[1]&amp;quot; LOC = B18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[2]&amp;quot; LOC = A18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[3]&amp;quot; LOC = B15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[4]&amp;quot; LOC = D17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[5]&amp;quot; LOC = C17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[6]&amp;quot; LOC = E17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[7]&amp;quot; LOC = A19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[0]&amp;quot; LOC = D19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[1]&amp;quot; LOC = F18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[2]&amp;quot; LOC = C20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[3]&amp;quot; LOC = C19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[4]&amp;quot; LOC = C18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[5]&amp;quot; LOC = B19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[6]&amp;quot; LOC = D18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[7]&amp;quot; LOC = F17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[0]&amp;quot; LOC = F19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[1]&amp;quot; LOC = G17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[2]&amp;quot; LOC = E19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[3]&amp;quot; LOC = D21;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[4]&amp;quot; LOC = D20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[5]&amp;quot; LOC = E18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[6]&amp;quot; LOC = C22;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;stopp&amp;quot;   LOC = V10;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[7]&amp;quot; LOC = E20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;ultraschall&amp;quot; LOC = AB13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;lampe&amp;quot;   LOC = W2;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=65372</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=65372"/>
		<updated>2012-03-30T22:51:28Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Übersicht.jpg|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:Schaltplan ultra.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Board layout ultra.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung2.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan ultra.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hardwarebeschreibungssprache VHDL==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.20 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company:                             FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer:                      Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:                         2011-06-28&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:                         ultraschall_1.1 &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description:             Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--                          wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
   Port (  clk :                         IN  std_logic;&lt;br /&gt;
           stopp :                       IN  std_logic;&lt;br /&gt;
           ultraschall :                 OUT  std_logic;&lt;br /&gt;
           lampe :                       OUT  std_logic;&lt;br /&gt;
           seg1 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg2 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg3 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg4 :                        out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal wegzaehler1 :                     STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal senderein :                       STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ultra :                           STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal einaus:                           STD_LOGIC_VECTOR (3 downto 0) :=&amp;quot;0000&amp;quot;;&lt;br /&gt;
signal startzaehler :                    STD_LOGIC_VECTOR (10 downto 0) :=&amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 :                            STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm :                          STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal mm:                               STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag:                             STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lampe &amp;lt;= not stopp;&lt;br /&gt;
ultraschall &amp;lt;=  einaus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk)                              --Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
&lt;br /&gt;
    clk2 &amp;lt;= clk2+1;                         --clk2 Zähl-Periode jetzt auf 50MHz	 &lt;br /&gt;
    if (clk2=728) then                      --auf 5mm einstellen: 0,005m * 50e6 Hz/ (343 m/s) = 729&lt;br /&gt;
        &lt;br /&gt;
        clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;             --doppelter Laufweg noch nicht berücksichtigt&lt;br /&gt;
&lt;br /&gt;
    end if;                                 --und 1011011000=728 weil er von 0 anfängt zu zählen&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )	                            --Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if einaus &amp;gt;= 14 then                    --14 da HIGH und LOW gezählt werden&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
			&lt;br /&gt;
    &lt;br /&gt;
    if clk2 = 728 then&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= startzaehler+1;     --Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=2047) then  --Periode der Messung (ca 30ms)&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (senderein = &#039;1&#039; ) then&lt;br /&gt;
&lt;br /&gt;
        ultra &amp;lt;= ultra+1;&lt;br /&gt;
&lt;br /&gt;
        if (ultra=625) then            -- 50MHz/40kHz/2= 625 Takte [2mal wegen ein/aus für Ultraschallkapsel 40kHz]&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= einaus + 1;      -- hier auch wirklich 625 Takte, weil er danach sofort eins dazuzählt&lt;br /&gt;
&lt;br /&gt;
            ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
        if einaus = 14 then            -- Rücksetzten&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=8) then           -- setzt alle ~30ms Zähler auf 0 zurück,1110 zusätzlich Trägheitsausgleich der Senderkapsel (offset)&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;      -- muss angepasst werden auf die jeweilige Spannung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (clk2 = 0) then                 -- erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= fivemm + 1;	       -- eigentliche Wegzählung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
		&lt;br /&gt;
    if (senderein=&#039;1&#039;) then            -- Bereit machen für Wertänderung&lt;br /&gt;
&lt;br /&gt;
        flag &amp;lt;= &#039;1&#039;;                   -- zeigt das Ultraschallimpuls unterwegs ist&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then                            --Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
        if (fivemm(10 downto 2) &amp;lt; 500) then                      -- Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
            if (fivemm(10 downto 2) &amp;gt; 2) then                    -- Zu nah dran -&amp;gt; alter Wert bleibt&lt;br /&gt;
                wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);  -- geteilt durch 2 wegen hin/zurück und 5mm extra&lt;br /&gt;
                mm &amp;lt;= fivemm(1);                                 -- 5mm&lt;br /&gt;
 &lt;br /&gt;
               wegzaehler1(9) &amp;lt;=&#039;0&#039;;&lt;br /&gt;
                flag &amp;lt;= &#039;0&#039;;                                     -- Impuls angekommen&lt;br /&gt;
            end if;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (fivemm=4095) then&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
        wegzaehler1(8 downto 0) &amp;lt;=&amp;quot;111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;			&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler2 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler3 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable m , dm , cm :    STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
cm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Meterberechnung&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 399) and (wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2:= wegzaehler1 - 400;		&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299) and (wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 300;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199) and (wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 200;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99) and (wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 100;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1;&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
    wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Dezimeterberechnung&lt;br /&gt;
if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -90;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -80;&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -70;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -60;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -50;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -40;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -30;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -20;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -10;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2;&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
    dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Zentimeterberechnung&lt;br /&gt;
if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    cm := wegzaehler3(3 downto 0);&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Millimeterberechnung				&lt;br /&gt;
CASE mm IS&lt;br /&gt;
    WHEN &#039;0&#039;    =&amp;gt; seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
&lt;br /&gt;
if (cm=&amp;quot;1111&amp;quot;) then   --falls Falscher Wert mm auf nichts&lt;br /&gt;
    seg4 &amp;lt;=&amp;quot;00000000&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
				&lt;br /&gt;
CASE cm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;		&lt;br /&gt;
END CASE;&lt;br /&gt;
		  &lt;br /&gt;
CASE dm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;&lt;br /&gt;
			&lt;br /&gt;
CASE m IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pinbelegung====&lt;br /&gt;
&lt;br /&gt;
[[Bild:Anschluss FPGA.jpg|right|miniatur| Abb.21 Anschluss am FPGA-Board ]]&lt;br /&gt;
[[Bild:Anschluss Signalverarbeitung.jpg|right|miniatur| Abb.22 Anschluss an der Signalverarbeitung ]]&lt;br /&gt;
&lt;br /&gt;
NET &amp;quot;clk&amp;quot;     LOC = AA12;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[0]&amp;quot; LOC = E15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[1]&amp;quot; LOC = E16;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[2]&amp;quot; LOC = A14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[3]&amp;quot; LOC = D14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[4]&amp;quot; LOC = D13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[5]&amp;quot; LOC = B13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[6]&amp;quot; LOC = E13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[7]&amp;quot; LOC = D15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[0]&amp;quot; LOC = B17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[1]&amp;quot; LOC = B18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[2]&amp;quot; LOC = A18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[3]&amp;quot; LOC = B15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[4]&amp;quot; LOC = D17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[5]&amp;quot; LOC = C17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[6]&amp;quot; LOC = E17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[7]&amp;quot; LOC = A19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[0]&amp;quot; LOC = D19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[1]&amp;quot; LOC = F18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[2]&amp;quot; LOC = C20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[3]&amp;quot; LOC = C19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[4]&amp;quot; LOC = C18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[5]&amp;quot; LOC = B19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[6]&amp;quot; LOC = D18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[7]&amp;quot; LOC = F17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[0]&amp;quot; LOC = F19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[1]&amp;quot; LOC = G17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[2]&amp;quot; LOC = E19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[3]&amp;quot; LOC = D21;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[4]&amp;quot; LOC = D20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[5]&amp;quot; LOC = E18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[6]&amp;quot; LOC = C22;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;stopp&amp;quot;   LOC = V10;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[7]&amp;quot; LOC = E20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;ultraschall&amp;quot; LOC = AB13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;lampe&amp;quot;   LOC = W2;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=65371</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=65371"/>
		<updated>2012-03-30T22:49:52Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Übersicht.jpg|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:Schaltplan ultra.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Board layout ultra.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung2.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan ultra.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hardwarebeschreibungssprache VHDL==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.20 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company:                             FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer:                      Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:                         2011-06-28&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:                         ultraschall_1.1 &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description:             Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--                          wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
   Port (  clk :                         IN  std_logic;&lt;br /&gt;
           stopp :                       IN  std_logic;&lt;br /&gt;
           ultraschall :                 OUT  std_logic;&lt;br /&gt;
           lampe :                       OUT  std_logic;&lt;br /&gt;
           seg1 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg2 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg3 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg4 :                        out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal wegzaehler1 :                     STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal senderein :                       STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ultra :                           STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal einaus:                           STD_LOGIC_VECTOR (3 downto 0) :=&amp;quot;0000&amp;quot;;&lt;br /&gt;
signal startzaehler :                    STD_LOGIC_VECTOR (10 downto 0) :=&amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 :                            STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm :                          STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal mm:                               STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag:                             STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lampe &amp;lt;= not stopp;&lt;br /&gt;
ultraschall &amp;lt;=  einaus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk)                              --Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
&lt;br /&gt;
    clk2 &amp;lt;= clk2+1;                         --clk2 Zähl-Periode jetzt auf 50MHz	 &lt;br /&gt;
    if (clk2=728) then                      --auf 5mm einstellen: 0,005m * 50e6 Hz/ (343 m/s) = 729&lt;br /&gt;
        &lt;br /&gt;
        clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;             --doppelter Laufweg noch nicht berücksichtigt&lt;br /&gt;
&lt;br /&gt;
    end if;                                 --und 1011011000=728 weil er von 0 anfängt zu zählen&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )	                            --Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if einaus &amp;gt;= 14 then                    --14 da HIGH und LOW gezählt werden&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
			&lt;br /&gt;
    &lt;br /&gt;
    if clk2 = 728 then&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= startzaehler+1;     --Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=2047) then  --Periode der Messung (ca 30ms)&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (senderein = &#039;1&#039; ) then&lt;br /&gt;
&lt;br /&gt;
        ultra &amp;lt;= ultra+1;&lt;br /&gt;
&lt;br /&gt;
        if (ultra=625) then            -- 50MHz/40kHz/2= 625 Takte [2mal wegen ein/aus für Ultraschallkapsel 40kHz]&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= einaus + 1;      -- hier auch wirklich 625 Takte, weil er danach sofort eins dazuzählt&lt;br /&gt;
&lt;br /&gt;
            ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
        if einaus = 14 then            -- Rücksetzten&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=8) then           -- setzt alle ~30ms Zähler auf 0 zurück,1110 zusätzlich Trägheitsausgleich der Senderkapsel (offset)&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;      -- muss angepasst werden auf die jeweilige Spannung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (clk2 = 0) then                 -- erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= fivemm + 1;	       -- eigentliche Wegzählung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
		&lt;br /&gt;
    if (senderein=&#039;1&#039;) then            -- Bereit machen für Wertänderung&lt;br /&gt;
&lt;br /&gt;
        flag &amp;lt;= &#039;1&#039;;                   -- zeigt das Ultraschallimpuls unterwegs ist&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then                            --Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
        if (fivemm(10 downto 2) &amp;lt; 500) then                      -- Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
            if (fivemm(10 downto 2) &amp;gt; 2) then                    -- Zu nah dran -&amp;gt; alter Wert bleibt&lt;br /&gt;
                wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);  -- geteilt durch 2 wegen hin/zurück und 5mm extra&lt;br /&gt;
                mm &amp;lt;= fivemm(1);                                 -- 5mm&lt;br /&gt;
 &lt;br /&gt;
               wegzaehler1(9) &amp;lt;=&#039;0&#039;;&lt;br /&gt;
                flag &amp;lt;= &#039;0&#039;;                                     -- Impuls angekommen&lt;br /&gt;
            end if;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (fivemm=4095) then&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
        wegzaehler1(8 downto 0) &amp;lt;=&amp;quot;111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;			&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler2 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler3 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable m , dm , cm :    STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
cm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Meterberechnung&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 399) and (wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2:= wegzaehler1 - 400;		&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299) and (wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 300;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199) and (wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 200;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99) and (wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 100;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1;&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
    wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Dezimeterberechnung&lt;br /&gt;
if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -90;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -80;&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -70;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -60;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -50;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -40;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -30;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -20;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -10;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2;&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
    dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Zentimeterberechnung&lt;br /&gt;
if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    cm := wegzaehler3(3 downto 0);&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Millimeterberechnung				&lt;br /&gt;
CASE mm IS&lt;br /&gt;
    WHEN &#039;0&#039;    =&amp;gt; seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
&lt;br /&gt;
if (cm=&amp;quot;1111&amp;quot;) then   --falls Falscher Wert mm auf nichts&lt;br /&gt;
    seg4 &amp;lt;=&amp;quot;00000000&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
				&lt;br /&gt;
CASE cm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;		&lt;br /&gt;
END CASE;&lt;br /&gt;
		  &lt;br /&gt;
CASE dm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;&lt;br /&gt;
			&lt;br /&gt;
CASE m IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pinbelegung====&lt;br /&gt;
&lt;br /&gt;
[[Bild:Anschluss FPGA.jpg|right|miniatur| Abb.21 Anschluss am FPGA-Board ]]&lt;br /&gt;
[[Bild:Anschluss Signalverarbeitung.jpg|right|miniatur| Abb.22 Anschluss an der Signalverarbeitung ]]&lt;br /&gt;
&lt;br /&gt;
NET &amp;quot;clk&amp;quot;     LOC = AA12;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[0]&amp;quot; LOC = E15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[1]&amp;quot; LOC = E16;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[2]&amp;quot; LOC = A14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[3]&amp;quot; LOC = D14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[4]&amp;quot; LOC = D13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[5]&amp;quot; LOC = B13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[6]&amp;quot; LOC = E13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[7]&amp;quot; LOC = D15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[0]&amp;quot; LOC = B17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[1]&amp;quot; LOC = B18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[2]&amp;quot; LOC = A18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[3]&amp;quot; LOC = B15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[4]&amp;quot; LOC = D17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[5]&amp;quot; LOC = C17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[6]&amp;quot; LOC = E17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[7]&amp;quot; LOC = A19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[0]&amp;quot; LOC = D19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[1]&amp;quot; LOC = F18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[2]&amp;quot; LOC = C20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[3]&amp;quot; LOC = C19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[4]&amp;quot; LOC = C18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[5]&amp;quot; LOC = B19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[6]&amp;quot; LOC = D18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[7]&amp;quot; LOC = F17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[0]&amp;quot; LOC = F19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[1]&amp;quot; LOC = G17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[2]&amp;quot; LOC = E19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[3]&amp;quot; LOC = D21;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[4]&amp;quot; LOC = D20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[5]&amp;quot; LOC = E18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[6]&amp;quot; LOC = C22;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;stopp&amp;quot;   LOC = V10;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[7]&amp;quot; LOC = E20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;ultraschall&amp;quot; LOC = AB13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;lampe&amp;quot;   LOC = W2;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=65370</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=65370"/>
		<updated>2012-03-30T22:48:51Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Gesamter Schaltplan und Aufbau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-06-28  23:45)&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Übersicht.jpg|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:Schaltplan ultra.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Board layout ultra.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung2.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan ultra.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hardwarebeschreibungssprache VHDL==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.20 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company:                             FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer:                      Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:                         2011-06-28&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:                         ultraschall_1.1 &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description:             Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--                          wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
   Port (  clk :                         IN  std_logic;&lt;br /&gt;
           stopp :                       IN  std_logic;&lt;br /&gt;
           ultraschall :                 OUT  std_logic;&lt;br /&gt;
           lampe :                       OUT  std_logic;&lt;br /&gt;
           seg1 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg2 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg3 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg4 :                        out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal wegzaehler1 :                     STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal senderein :                       STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ultra :                           STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal einaus:                           STD_LOGIC_VECTOR (3 downto 0) :=&amp;quot;0000&amp;quot;;&lt;br /&gt;
signal startzaehler :                    STD_LOGIC_VECTOR (10 downto 0) :=&amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 :                            STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm :                          STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal mm:                               STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag:                             STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lampe &amp;lt;= not stopp;&lt;br /&gt;
ultraschall &amp;lt;=  einaus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk)                              --Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
&lt;br /&gt;
    clk2 &amp;lt;= clk2+1;                         --clk2 Zähl-Periode jetzt auf 50MHz	 &lt;br /&gt;
    if (clk2=728) then                      --auf 5mm einstellen: 0,005m * 50e6 Hz/ (343 m/s) = 729&lt;br /&gt;
        &lt;br /&gt;
        clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;             --doppelter Laufweg noch nicht berücksichtigt&lt;br /&gt;
&lt;br /&gt;
    end if;                                 --und 1011011000=728 weil er von 0 anfängt zu zählen&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )	                            --Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if einaus &amp;gt;= 14 then                    --14 da HIGH und LOW gezählt werden&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
			&lt;br /&gt;
    &lt;br /&gt;
    if clk2 = 728 then&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= startzaehler+1;     --Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=2047) then  --Periode der Messung (ca 30ms)&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (senderein = &#039;1&#039; ) then&lt;br /&gt;
&lt;br /&gt;
        ultra &amp;lt;= ultra+1;&lt;br /&gt;
&lt;br /&gt;
        if (ultra=625) then            -- 50MHz/40kHz/2= 625 Takte [2mal wegen ein/aus für Ultraschallkapsel 40kHz]&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= einaus + 1;      -- hier auch wirklich 625 Takte, weil er danach sofort eins dazuzählt&lt;br /&gt;
&lt;br /&gt;
            ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
        if einaus = 14 then            -- Rücksetzten&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=8) then           -- setzt alle ~30ms Zähler auf 0 zurück,1110 zusätzlich Trägheitsausgleich der Senderkapsel (offset)&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;      -- muss angepasst werden auf die jeweilige Spannung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (clk2 = 0) then                 -- erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= fivemm + 1;	       -- eigentliche Wegzählung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
		&lt;br /&gt;
    if (senderein=&#039;1&#039;) then            -- Bereit machen für Wertänderung&lt;br /&gt;
&lt;br /&gt;
        flag &amp;lt;= &#039;1&#039;;                   -- zeigt das Ultraschallimpuls unterwegs ist&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then                            --Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
        if (fivemm(10 downto 2) &amp;lt; 500) then                      -- Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
            if (fivemm(10 downto 2) &amp;gt; 2) then                    -- Zu nah dran -&amp;gt; alter Wert bleibt&lt;br /&gt;
                wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);  -- geteilt durch 2 wegen hin/zurück und 5mm extra&lt;br /&gt;
                mm &amp;lt;= fivemm(1);                                 -- 5mm&lt;br /&gt;
 &lt;br /&gt;
               wegzaehler1(9) &amp;lt;=&#039;0&#039;;&lt;br /&gt;
                flag &amp;lt;= &#039;0&#039;;                                     -- Impuls angekommen&lt;br /&gt;
            end if;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (fivemm=4095) then&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
        wegzaehler1(8 downto 0) &amp;lt;=&amp;quot;111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;			&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler2 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler3 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable m , dm , cm :    STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
cm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Meterberechnung&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 399) and (wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2:= wegzaehler1 - 400;		&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299) and (wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 300;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199) and (wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 200;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99) and (wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 100;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1;&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
    wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Dezimeterberechnung&lt;br /&gt;
if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -90;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -80;&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -70;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -60;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -50;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -40;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -30;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -20;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -10;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2;&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
    dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Zentimeterberechnung&lt;br /&gt;
if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    cm := wegzaehler3(3 downto 0);&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Millimeterberechnung				&lt;br /&gt;
CASE mm IS&lt;br /&gt;
    WHEN &#039;0&#039;    =&amp;gt; seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
&lt;br /&gt;
if (cm=&amp;quot;1111&amp;quot;) then   --falls Falscher Wert mm auf nichts&lt;br /&gt;
    seg4 &amp;lt;=&amp;quot;00000000&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
				&lt;br /&gt;
CASE cm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;		&lt;br /&gt;
END CASE;&lt;br /&gt;
		  &lt;br /&gt;
CASE dm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;&lt;br /&gt;
			&lt;br /&gt;
CASE m IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pinbelegung====&lt;br /&gt;
&lt;br /&gt;
[[Bild:Anschluss FPGA.jpg|right|miniatur| Abb.21 Anschluss am FPGA-Board ]]&lt;br /&gt;
[[Bild:Anschluss Signalverarbeitung.jpg|right|miniatur| Abb.22 Anschluss an der Signalverarbeitung ]]&lt;br /&gt;
&lt;br /&gt;
NET &amp;quot;clk&amp;quot;     LOC = AA12;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[0]&amp;quot; LOC = E15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[1]&amp;quot; LOC = E16;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[2]&amp;quot; LOC = A14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[3]&amp;quot; LOC = D14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[4]&amp;quot; LOC = D13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[5]&amp;quot; LOC = B13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[6]&amp;quot; LOC = E13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[7]&amp;quot; LOC = D15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[0]&amp;quot; LOC = B17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[1]&amp;quot; LOC = B18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[2]&amp;quot; LOC = A18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[3]&amp;quot; LOC = B15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[4]&amp;quot; LOC = D17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[5]&amp;quot; LOC = C17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[6]&amp;quot; LOC = E17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[7]&amp;quot; LOC = A19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[0]&amp;quot; LOC = D19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[1]&amp;quot; LOC = F18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[2]&amp;quot; LOC = C20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[3]&amp;quot; LOC = C19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[4]&amp;quot; LOC = C18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[5]&amp;quot; LOC = B19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[6]&amp;quot; LOC = D18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[7]&amp;quot; LOC = F17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[0]&amp;quot; LOC = F19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[1]&amp;quot; LOC = G17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[2]&amp;quot; LOC = E19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[3]&amp;quot; LOC = D21;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[4]&amp;quot; LOC = D20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[5]&amp;quot; LOC = E18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[6]&amp;quot; LOC = C22;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;stopp&amp;quot;   LOC = V10;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[7]&amp;quot; LOC = E20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;ultraschall&amp;quot; LOC = AB13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;lampe&amp;quot;   LOC = W2;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Schaltplan_ultra.png&amp;diff=65369</id>
		<title>Datei:Schaltplan ultra.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Schaltplan_ultra.png&amp;diff=65369"/>
		<updated>2012-03-30T22:47:54Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: Schaltplan der Ultraschallentfernungsmessung mittels FPGA&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schaltplan der Ultraschallentfernungsmessung mittels FPGA&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=65368</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=65368"/>
		<updated>2012-03-30T22:46:45Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Gesamter Schaltplan und Aufbau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-06-28  23:45)&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Übersicht.jpg|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Board layout ultra.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung2.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan ultra.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hardwarebeschreibungssprache VHDL==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.20 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company:                             FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer:                      Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:                         2011-06-28&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:                         ultraschall_1.1 &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description:             Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--                          wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
   Port (  clk :                         IN  std_logic;&lt;br /&gt;
           stopp :                       IN  std_logic;&lt;br /&gt;
           ultraschall :                 OUT  std_logic;&lt;br /&gt;
           lampe :                       OUT  std_logic;&lt;br /&gt;
           seg1 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg2 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg3 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg4 :                        out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal wegzaehler1 :                     STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal senderein :                       STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ultra :                           STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal einaus:                           STD_LOGIC_VECTOR (3 downto 0) :=&amp;quot;0000&amp;quot;;&lt;br /&gt;
signal startzaehler :                    STD_LOGIC_VECTOR (10 downto 0) :=&amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 :                            STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm :                          STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal mm:                               STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag:                             STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lampe &amp;lt;= not stopp;&lt;br /&gt;
ultraschall &amp;lt;=  einaus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk)                              --Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
&lt;br /&gt;
    clk2 &amp;lt;= clk2+1;                         --clk2 Zähl-Periode jetzt auf 50MHz	 &lt;br /&gt;
    if (clk2=728) then                      --auf 5mm einstellen: 0,005m * 50e6 Hz/ (343 m/s) = 729&lt;br /&gt;
        &lt;br /&gt;
        clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;             --doppelter Laufweg noch nicht berücksichtigt&lt;br /&gt;
&lt;br /&gt;
    end if;                                 --und 1011011000=728 weil er von 0 anfängt zu zählen&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )	                            --Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if einaus &amp;gt;= 14 then                    --14 da HIGH und LOW gezählt werden&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
			&lt;br /&gt;
    &lt;br /&gt;
    if clk2 = 728 then&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= startzaehler+1;     --Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=2047) then  --Periode der Messung (ca 30ms)&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (senderein = &#039;1&#039; ) then&lt;br /&gt;
&lt;br /&gt;
        ultra &amp;lt;= ultra+1;&lt;br /&gt;
&lt;br /&gt;
        if (ultra=625) then            -- 50MHz/40kHz/2= 625 Takte [2mal wegen ein/aus für Ultraschallkapsel 40kHz]&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= einaus + 1;      -- hier auch wirklich 625 Takte, weil er danach sofort eins dazuzählt&lt;br /&gt;
&lt;br /&gt;
            ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
        if einaus = 14 then            -- Rücksetzten&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=8) then           -- setzt alle ~30ms Zähler auf 0 zurück,1110 zusätzlich Trägheitsausgleich der Senderkapsel (offset)&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;      -- muss angepasst werden auf die jeweilige Spannung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (clk2 = 0) then                 -- erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= fivemm + 1;	       -- eigentliche Wegzählung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
		&lt;br /&gt;
    if (senderein=&#039;1&#039;) then            -- Bereit machen für Wertänderung&lt;br /&gt;
&lt;br /&gt;
        flag &amp;lt;= &#039;1&#039;;                   -- zeigt das Ultraschallimpuls unterwegs ist&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then                            --Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
        if (fivemm(10 downto 2) &amp;lt; 500) then                      -- Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
            if (fivemm(10 downto 2) &amp;gt; 2) then                    -- Zu nah dran -&amp;gt; alter Wert bleibt&lt;br /&gt;
                wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);  -- geteilt durch 2 wegen hin/zurück und 5mm extra&lt;br /&gt;
                mm &amp;lt;= fivemm(1);                                 -- 5mm&lt;br /&gt;
 &lt;br /&gt;
               wegzaehler1(9) &amp;lt;=&#039;0&#039;;&lt;br /&gt;
                flag &amp;lt;= &#039;0&#039;;                                     -- Impuls angekommen&lt;br /&gt;
            end if;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (fivemm=4095) then&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
        wegzaehler1(8 downto 0) &amp;lt;=&amp;quot;111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;			&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler2 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler3 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable m , dm , cm :    STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
cm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Meterberechnung&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 399) and (wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2:= wegzaehler1 - 400;		&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299) and (wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 300;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199) and (wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 200;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99) and (wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 100;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1;&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
    wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Dezimeterberechnung&lt;br /&gt;
if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -90;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -80;&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -70;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -60;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -50;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -40;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -30;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -20;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -10;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2;&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
    dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Zentimeterberechnung&lt;br /&gt;
if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    cm := wegzaehler3(3 downto 0);&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Millimeterberechnung				&lt;br /&gt;
CASE mm IS&lt;br /&gt;
    WHEN &#039;0&#039;    =&amp;gt; seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
&lt;br /&gt;
if (cm=&amp;quot;1111&amp;quot;) then   --falls Falscher Wert mm auf nichts&lt;br /&gt;
    seg4 &amp;lt;=&amp;quot;00000000&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
				&lt;br /&gt;
CASE cm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;		&lt;br /&gt;
END CASE;&lt;br /&gt;
		  &lt;br /&gt;
CASE dm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;&lt;br /&gt;
			&lt;br /&gt;
CASE m IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pinbelegung====&lt;br /&gt;
&lt;br /&gt;
[[Bild:Anschluss FPGA.jpg|right|miniatur| Abb.21 Anschluss am FPGA-Board ]]&lt;br /&gt;
[[Bild:Anschluss Signalverarbeitung.jpg|right|miniatur| Abb.22 Anschluss an der Signalverarbeitung ]]&lt;br /&gt;
&lt;br /&gt;
NET &amp;quot;clk&amp;quot;     LOC = AA12;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[0]&amp;quot; LOC = E15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[1]&amp;quot; LOC = E16;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[2]&amp;quot; LOC = A14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[3]&amp;quot; LOC = D14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[4]&amp;quot; LOC = D13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[5]&amp;quot; LOC = B13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[6]&amp;quot; LOC = E13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[7]&amp;quot; LOC = D15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[0]&amp;quot; LOC = B17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[1]&amp;quot; LOC = B18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[2]&amp;quot; LOC = A18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[3]&amp;quot; LOC = B15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[4]&amp;quot; LOC = D17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[5]&amp;quot; LOC = C17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[6]&amp;quot; LOC = E17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[7]&amp;quot; LOC = A19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[0]&amp;quot; LOC = D19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[1]&amp;quot; LOC = F18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[2]&amp;quot; LOC = C20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[3]&amp;quot; LOC = C19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[4]&amp;quot; LOC = C18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[5]&amp;quot; LOC = B19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[6]&amp;quot; LOC = D18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[7]&amp;quot; LOC = F17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[0]&amp;quot; LOC = F19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[1]&amp;quot; LOC = G17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[2]&amp;quot; LOC = E19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[3]&amp;quot; LOC = D21;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[4]&amp;quot; LOC = D20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[5]&amp;quot; LOC = E18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[6]&amp;quot; LOC = C22;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;stopp&amp;quot;   LOC = V10;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[7]&amp;quot; LOC = E20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;ultraschall&amp;quot; LOC = AB13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;lampe&amp;quot;   LOC = W2;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Board_layout_ultra.png&amp;diff=65367</id>
		<title>Datei:Board layout ultra.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Board_layout_ultra.png&amp;diff=65367"/>
		<updated>2012-03-30T22:44:57Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: Layout der Ultraschallentfernungsmessung mit FPGA&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Layout der Ultraschallentfernungsmessung mit FPGA&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=65366</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=65366"/>
		<updated>2012-03-30T22:44:11Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Gesamter Schaltplan und Aufbau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-06-28  23:45)&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Übersicht.jpg|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Layout.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung2.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan ultra.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hardwarebeschreibungssprache VHDL==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.20 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company:                             FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer:                      Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:                         2011-06-28&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:                         ultraschall_1.1 &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description:             Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--                          wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
   Port (  clk :                         IN  std_logic;&lt;br /&gt;
           stopp :                       IN  std_logic;&lt;br /&gt;
           ultraschall :                 OUT  std_logic;&lt;br /&gt;
           lampe :                       OUT  std_logic;&lt;br /&gt;
           seg1 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg2 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg3 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg4 :                        out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal wegzaehler1 :                     STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal senderein :                       STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ultra :                           STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal einaus:                           STD_LOGIC_VECTOR (3 downto 0) :=&amp;quot;0000&amp;quot;;&lt;br /&gt;
signal startzaehler :                    STD_LOGIC_VECTOR (10 downto 0) :=&amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 :                            STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm :                          STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal mm:                               STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag:                             STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lampe &amp;lt;= not stopp;&lt;br /&gt;
ultraschall &amp;lt;=  einaus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk)                              --Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
&lt;br /&gt;
    clk2 &amp;lt;= clk2+1;                         --clk2 Zähl-Periode jetzt auf 50MHz	 &lt;br /&gt;
    if (clk2=728) then                      --auf 5mm einstellen: 0,005m * 50e6 Hz/ (343 m/s) = 729&lt;br /&gt;
        &lt;br /&gt;
        clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;             --doppelter Laufweg noch nicht berücksichtigt&lt;br /&gt;
&lt;br /&gt;
    end if;                                 --und 1011011000=728 weil er von 0 anfängt zu zählen&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )	                            --Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if einaus &amp;gt;= 14 then                    --14 da HIGH und LOW gezählt werden&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
			&lt;br /&gt;
    &lt;br /&gt;
    if clk2 = 728 then&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= startzaehler+1;     --Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=2047) then  --Periode der Messung (ca 30ms)&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (senderein = &#039;1&#039; ) then&lt;br /&gt;
&lt;br /&gt;
        ultra &amp;lt;= ultra+1;&lt;br /&gt;
&lt;br /&gt;
        if (ultra=625) then            -- 50MHz/40kHz/2= 625 Takte [2mal wegen ein/aus für Ultraschallkapsel 40kHz]&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= einaus + 1;      -- hier auch wirklich 625 Takte, weil er danach sofort eins dazuzählt&lt;br /&gt;
&lt;br /&gt;
            ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
        if einaus = 14 then            -- Rücksetzten&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=8) then           -- setzt alle ~30ms Zähler auf 0 zurück,1110 zusätzlich Trägheitsausgleich der Senderkapsel (offset)&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;      -- muss angepasst werden auf die jeweilige Spannung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (clk2 = 0) then                 -- erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= fivemm + 1;	       -- eigentliche Wegzählung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
		&lt;br /&gt;
    if (senderein=&#039;1&#039;) then            -- Bereit machen für Wertänderung&lt;br /&gt;
&lt;br /&gt;
        flag &amp;lt;= &#039;1&#039;;                   -- zeigt das Ultraschallimpuls unterwegs ist&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then                            --Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
        if (fivemm(10 downto 2) &amp;lt; 500) then                      -- Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
            if (fivemm(10 downto 2) &amp;gt; 2) then                    -- Zu nah dran -&amp;gt; alter Wert bleibt&lt;br /&gt;
                wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);  -- geteilt durch 2 wegen hin/zurück und 5mm extra&lt;br /&gt;
                mm &amp;lt;= fivemm(1);                                 -- 5mm&lt;br /&gt;
 &lt;br /&gt;
               wegzaehler1(9) &amp;lt;=&#039;0&#039;;&lt;br /&gt;
                flag &amp;lt;= &#039;0&#039;;                                     -- Impuls angekommen&lt;br /&gt;
            end if;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (fivemm=4095) then&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
        wegzaehler1(8 downto 0) &amp;lt;=&amp;quot;111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;			&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler2 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler3 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable m , dm , cm :    STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
cm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Meterberechnung&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 399) and (wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2:= wegzaehler1 - 400;		&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299) and (wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 300;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199) and (wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 200;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99) and (wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 100;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1;&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
    wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Dezimeterberechnung&lt;br /&gt;
if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -90;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -80;&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -70;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -60;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -50;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -40;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -30;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -20;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -10;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2;&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
    dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Zentimeterberechnung&lt;br /&gt;
if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    cm := wegzaehler3(3 downto 0);&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Millimeterberechnung				&lt;br /&gt;
CASE mm IS&lt;br /&gt;
    WHEN &#039;0&#039;    =&amp;gt; seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
&lt;br /&gt;
if (cm=&amp;quot;1111&amp;quot;) then   --falls Falscher Wert mm auf nichts&lt;br /&gt;
    seg4 &amp;lt;=&amp;quot;00000000&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
				&lt;br /&gt;
CASE cm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;		&lt;br /&gt;
END CASE;&lt;br /&gt;
		  &lt;br /&gt;
CASE dm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;&lt;br /&gt;
			&lt;br /&gt;
CASE m IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pinbelegung====&lt;br /&gt;
&lt;br /&gt;
[[Bild:Anschluss FPGA.jpg|right|miniatur| Abb.21 Anschluss am FPGA-Board ]]&lt;br /&gt;
[[Bild:Anschluss Signalverarbeitung.jpg|right|miniatur| Abb.22 Anschluss an der Signalverarbeitung ]]&lt;br /&gt;
&lt;br /&gt;
NET &amp;quot;clk&amp;quot;     LOC = AA12;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[0]&amp;quot; LOC = E15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[1]&amp;quot; LOC = E16;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[2]&amp;quot; LOC = A14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[3]&amp;quot; LOC = D14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[4]&amp;quot; LOC = D13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[5]&amp;quot; LOC = B13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[6]&amp;quot; LOC = E13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[7]&amp;quot; LOC = D15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[0]&amp;quot; LOC = B17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[1]&amp;quot; LOC = B18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[2]&amp;quot; LOC = A18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[3]&amp;quot; LOC = B15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[4]&amp;quot; LOC = D17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[5]&amp;quot; LOC = C17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[6]&amp;quot; LOC = E17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[7]&amp;quot; LOC = A19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[0]&amp;quot; LOC = D19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[1]&amp;quot; LOC = F18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[2]&amp;quot; LOC = C20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[3]&amp;quot; LOC = C19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[4]&amp;quot; LOC = C18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[5]&amp;quot; LOC = B19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[6]&amp;quot; LOC = D18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[7]&amp;quot; LOC = F17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[0]&amp;quot; LOC = F19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[1]&amp;quot; LOC = G17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[2]&amp;quot; LOC = E19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[3]&amp;quot; LOC = D21;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[4]&amp;quot; LOC = D20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[5]&amp;quot; LOC = E18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[6]&amp;quot; LOC = C22;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;stopp&amp;quot;   LOC = V10;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[7]&amp;quot; LOC = E20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;ultraschall&amp;quot; LOC = AB13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;lampe&amp;quot;   LOC = W2;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Best%C3%BCckungsplan_ultra.png&amp;diff=65365</id>
		<title>Datei:Bestückungsplan ultra.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Best%C3%BCckungsplan_ultra.png&amp;diff=65365"/>
		<updated>2012-03-30T22:42:48Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: Bestückungsplan der Ultraschallentfernungsmessung mittels FPGA&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bestückungsplan der Ultraschallentfernungsmessung mittels FPGA&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=58233</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=58233"/>
		<updated>2011-06-28T21:49:13Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-06-28  23:45)&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Übersicht.jpg|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Layout.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung2.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hardwarebeschreibungssprache VHDL==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.20 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company:                             FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer:                      Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:                         2011-06-28&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:                         ultraschall_1.1 &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description:             Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--                          wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
   Port (  clk :                         IN  std_logic;&lt;br /&gt;
           stopp :                       IN  std_logic;&lt;br /&gt;
           ultraschall :                 OUT  std_logic;&lt;br /&gt;
           lampe :                       OUT  std_logic;&lt;br /&gt;
           seg1 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg2 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg3 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg4 :                        out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal wegzaehler1 :                     STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal senderein :                       STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ultra :                           STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal einaus:                           STD_LOGIC_VECTOR (3 downto 0) :=&amp;quot;0000&amp;quot;;&lt;br /&gt;
signal startzaehler :                    STD_LOGIC_VECTOR (10 downto 0) :=&amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 :                            STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm :                          STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal mm:                               STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag:                             STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lampe &amp;lt;= not stopp;&lt;br /&gt;
ultraschall &amp;lt;=  einaus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk)                              --Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
&lt;br /&gt;
    clk2 &amp;lt;= clk2+1;                         --clk2 Zähl-Periode jetzt auf 50MHz	 &lt;br /&gt;
    if (clk2=728) then                      --auf 5mm einstellen: 0,005m * 50e6 Hz/ (343 m/s) = 729&lt;br /&gt;
        &lt;br /&gt;
        clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;             --doppelter Laufweg noch nicht berücksichtigt&lt;br /&gt;
&lt;br /&gt;
    end if;                                 --und 1011011000=728 weil er von 0 anfängt zu zählen&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )	                            --Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if einaus &amp;gt;= 14 then                    --14 da HIGH und LOW gezählt werden&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
			&lt;br /&gt;
    &lt;br /&gt;
    if clk2 = 728 then&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= startzaehler+1;     --Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=2047) then  --Periode der Messung (ca 30ms)&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (senderein = &#039;1&#039; ) then&lt;br /&gt;
&lt;br /&gt;
        ultra &amp;lt;= ultra+1;&lt;br /&gt;
&lt;br /&gt;
        if (ultra=625) then            -- 50MHz/40kHz/2= 625 Takte [2mal wegen ein/aus für Ultraschallkapsel 40kHz]&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= einaus + 1;      -- hier auch wirklich 625 Takte, weil er danach sofort eins dazuzählt&lt;br /&gt;
&lt;br /&gt;
            ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
        if einaus = 14 then            -- Rücksetzten&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=8) then           -- setzt alle ~30ms Zähler auf 0 zurück,1110 zusätzlich Trägheitsausgleich der Senderkapsel (offset)&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;      -- muss angepasst werden auf die jeweilige Spannung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (clk2 = 0) then                 -- erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= fivemm + 1;	       -- eigentliche Wegzählung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
		&lt;br /&gt;
    if (senderein=&#039;1&#039;) then            -- Bereit machen für Wertänderung&lt;br /&gt;
&lt;br /&gt;
        flag &amp;lt;= &#039;1&#039;;                   -- zeigt das Ultraschallimpuls unterwegs ist&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then                            --Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
        if (fivemm(10 downto 2) &amp;lt; 500) then                      -- Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
            if (fivemm(10 downto 2) &amp;gt; 2) then                    -- Zu nah dran -&amp;gt; alter Wert bleibt&lt;br /&gt;
                wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);  -- geteilt durch 2 wegen hin/zurück und 5mm extra&lt;br /&gt;
                mm &amp;lt;= fivemm(1);                                 -- 5mm&lt;br /&gt;
 &lt;br /&gt;
               wegzaehler1(9) &amp;lt;=&#039;0&#039;;&lt;br /&gt;
                flag &amp;lt;= &#039;0&#039;;                                     -- Impuls angekommen&lt;br /&gt;
            end if;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (fivemm=4095) then&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
        wegzaehler1(8 downto 0) &amp;lt;=&amp;quot;111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;			&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler2 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler3 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable m , dm , cm :    STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
cm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Meterberechnung&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 399) and (wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2:= wegzaehler1 - 400;		&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299) and (wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 300;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199) and (wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 200;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99) and (wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 100;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1;&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
    wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Dezimeterberechnung&lt;br /&gt;
if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -90;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -80;&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -70;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -60;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -50;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -40;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -30;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -20;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -10;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2;&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
    dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Zentimeterberechnung&lt;br /&gt;
if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    cm := wegzaehler3(3 downto 0);&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Millimeterberechnung				&lt;br /&gt;
CASE mm IS&lt;br /&gt;
    WHEN &#039;0&#039;    =&amp;gt; seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
&lt;br /&gt;
if (cm=&amp;quot;1111&amp;quot;) then   --falls Falscher Wert mm auf nichts&lt;br /&gt;
    seg4 &amp;lt;=&amp;quot;00000000&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
				&lt;br /&gt;
CASE cm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;		&lt;br /&gt;
END CASE;&lt;br /&gt;
		  &lt;br /&gt;
CASE dm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;&lt;br /&gt;
			&lt;br /&gt;
CASE m IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pinbelegung====&lt;br /&gt;
&lt;br /&gt;
[[Bild:Anschluss FPGA.jpg|right|miniatur| Abb.21 Anschluss am FPGA-Board ]]&lt;br /&gt;
[[Bild:Anschluss Signalverarbeitung.jpg|right|miniatur| Abb.22 Anschluss an der Signalverarbeitung ]]&lt;br /&gt;
&lt;br /&gt;
NET &amp;quot;clk&amp;quot;     LOC = AA12;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[0]&amp;quot; LOC = E15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[1]&amp;quot; LOC = E16;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[2]&amp;quot; LOC = A14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[3]&amp;quot; LOC = D14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[4]&amp;quot; LOC = D13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[5]&amp;quot; LOC = B13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[6]&amp;quot; LOC = E13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[7]&amp;quot; LOC = D15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[0]&amp;quot; LOC = B17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[1]&amp;quot; LOC = B18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[2]&amp;quot; LOC = A18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[3]&amp;quot; LOC = B15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[4]&amp;quot; LOC = D17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[5]&amp;quot; LOC = C17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[6]&amp;quot; LOC = E17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[7]&amp;quot; LOC = A19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[0]&amp;quot; LOC = D19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[1]&amp;quot; LOC = F18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[2]&amp;quot; LOC = C20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[3]&amp;quot; LOC = C19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[4]&amp;quot; LOC = C18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[5]&amp;quot; LOC = B19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[6]&amp;quot; LOC = D18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[7]&amp;quot; LOC = F17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[0]&amp;quot; LOC = F19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[1]&amp;quot; LOC = G17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[2]&amp;quot; LOC = E19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[3]&amp;quot; LOC = D21;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[4]&amp;quot; LOC = D20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[5]&amp;quot; LOC = E18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[6]&amp;quot; LOC = C22;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;stopp&amp;quot;   LOC = V10;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[7]&amp;quot; LOC = E20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;ultraschall&amp;quot; LOC = AB13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;lampe&amp;quot;   LOC = W2;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=58232</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=58232"/>
		<updated>2011-06-28T21:48:16Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Pinbelegung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-06-28  22:00)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Übersicht.jpg|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Layout.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung2.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hardwarebeschreibungssprache VHDL==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.20 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company:                             FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer:                      Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:                         2011-06-28&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:                         ultraschall_1.1 &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description:             Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--                          wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
   Port (  clk :                         IN  std_logic;&lt;br /&gt;
           stopp :                       IN  std_logic;&lt;br /&gt;
           ultraschall :                 OUT  std_logic;&lt;br /&gt;
           lampe :                       OUT  std_logic;&lt;br /&gt;
           seg1 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg2 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg3 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg4 :                        out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal wegzaehler1 :                     STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal senderein :                       STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ultra :                           STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal einaus:                           STD_LOGIC_VECTOR (3 downto 0) :=&amp;quot;0000&amp;quot;;&lt;br /&gt;
signal startzaehler :                    STD_LOGIC_VECTOR (10 downto 0) :=&amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 :                            STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm :                          STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal mm:                               STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag:                             STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lampe &amp;lt;= not stopp;&lt;br /&gt;
ultraschall &amp;lt;=  einaus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk)                              --Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
&lt;br /&gt;
    clk2 &amp;lt;= clk2+1;                         --clk2 Zähl-Periode jetzt auf 50MHz	 &lt;br /&gt;
    if (clk2=728) then                      --auf 5mm einstellen: 0,005m * 50e6 Hz/ (343 m/s) = 729&lt;br /&gt;
        &lt;br /&gt;
        clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;             --doppelter Laufweg noch nicht berücksichtigt&lt;br /&gt;
&lt;br /&gt;
    end if;                                 --und 1011011000=728 weil er von 0 anfängt zu zählen&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )	                            --Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if einaus &amp;gt;= 14 then                    --14 da HIGH und LOW gezählt werden&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
			&lt;br /&gt;
    &lt;br /&gt;
    if clk2 = 728 then&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= startzaehler+1;     --Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=2047) then  --Periode der Messung (ca 30ms)&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (senderein = &#039;1&#039; ) then&lt;br /&gt;
&lt;br /&gt;
        ultra &amp;lt;= ultra+1;&lt;br /&gt;
&lt;br /&gt;
        if (ultra=625) then            -- 50MHz/40kHz/2= 625 Takte [2mal wegen ein/aus für Ultraschallkapsel 40kHz]&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= einaus + 1;      -- hier auch wirklich 625 Takte, weil er danach sofort eins dazuzählt&lt;br /&gt;
&lt;br /&gt;
            ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
        if einaus = 14 then            -- Rücksetzten&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=8) then           -- setzt alle ~30ms Zähler auf 0 zurück,1110 zusätzlich Trägheitsausgleich der Senderkapsel (offset)&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;      -- muss angepasst werden auf die jeweilige Spannung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (clk2 = 0) then                 -- erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= fivemm + 1;	       -- eigentliche Wegzählung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
		&lt;br /&gt;
    if (senderein=&#039;1&#039;) then            -- Bereit machen für Wertänderung&lt;br /&gt;
&lt;br /&gt;
        flag &amp;lt;= &#039;1&#039;;                   -- zeigt das Ultraschallimpuls unterwegs ist&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then                            --Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
        if (fivemm(10 downto 2) &amp;lt; 500) then                      -- Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
            if (fivemm(10 downto 2) &amp;gt; 2) then                    -- Zu nah dran -&amp;gt; alter Wert bleibt&lt;br /&gt;
                wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);  -- geteilt durch 2 wegen hin/zurück und 5mm extra&lt;br /&gt;
                mm &amp;lt;= fivemm(1);                                 -- 5mm&lt;br /&gt;
 &lt;br /&gt;
               wegzaehler1(9) &amp;lt;=&#039;0&#039;;&lt;br /&gt;
                flag &amp;lt;= &#039;0&#039;;                                     -- Impuls angekommen&lt;br /&gt;
            end if;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (fivemm=4095) then&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
        wegzaehler1(8 downto 0) &amp;lt;=&amp;quot;111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;			&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler2 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler3 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable m , dm , cm :    STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
cm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Meterberechnung&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 399) and (wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2:= wegzaehler1 - 400;		&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299) and (wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 300;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199) and (wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 200;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99) and (wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 100;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1;&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
    wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Dezimeterberechnung&lt;br /&gt;
if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -90;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -80;&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -70;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -60;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -50;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -40;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -30;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -20;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -10;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2;&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
    dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Zentimeterberechnung&lt;br /&gt;
if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    cm := wegzaehler3(3 downto 0);&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Millimeterberechnung				&lt;br /&gt;
CASE mm IS&lt;br /&gt;
    WHEN &#039;0&#039;    =&amp;gt; seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
&lt;br /&gt;
if (cm=&amp;quot;1111&amp;quot;) then   --falls Falscher Wert mm auf nichts&lt;br /&gt;
    seg4 &amp;lt;=&amp;quot;00000000&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
				&lt;br /&gt;
CASE cm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;		&lt;br /&gt;
END CASE;&lt;br /&gt;
		  &lt;br /&gt;
CASE dm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;&lt;br /&gt;
			&lt;br /&gt;
CASE m IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pinbelegung====&lt;br /&gt;
&lt;br /&gt;
[[Bild:Anschluss FPGA.jpg|right|miniatur| Abb.21 Anschluss am FPGA-Board ]]&lt;br /&gt;
[[Bild:Anschluss Signalverarbeitung.jpg|right|miniatur| Abb.22 Anschluss an der Signalverarbeitung ]]&lt;br /&gt;
&lt;br /&gt;
NET &amp;quot;clk&amp;quot;     LOC = AA12;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[0]&amp;quot; LOC = E15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[1]&amp;quot; LOC = E16;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[2]&amp;quot; LOC = A14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[3]&amp;quot; LOC = D14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[4]&amp;quot; LOC = D13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[5]&amp;quot; LOC = B13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[6]&amp;quot; LOC = E13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[7]&amp;quot; LOC = D15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[0]&amp;quot; LOC = B17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[1]&amp;quot; LOC = B18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[2]&amp;quot; LOC = A18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[3]&amp;quot; LOC = B15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[4]&amp;quot; LOC = D17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[5]&amp;quot; LOC = C17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[6]&amp;quot; LOC = E17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[7]&amp;quot; LOC = A19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[0]&amp;quot; LOC = D19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[1]&amp;quot; LOC = F18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[2]&amp;quot; LOC = C20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[3]&amp;quot; LOC = C19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[4]&amp;quot; LOC = C18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[5]&amp;quot; LOC = B19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[6]&amp;quot; LOC = D18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[7]&amp;quot; LOC = F17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[0]&amp;quot; LOC = F19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[1]&amp;quot; LOC = G17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[2]&amp;quot; LOC = E19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[3]&amp;quot; LOC = D21;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[4]&amp;quot; LOC = D20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[5]&amp;quot; LOC = E18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[6]&amp;quot; LOC = C22;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;stopp&amp;quot;   LOC = V10;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[7]&amp;quot; LOC = E20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;ultraschall&amp;quot; LOC = AB13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;lampe&amp;quot;   LOC = W2;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=58231</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=58231"/>
		<updated>2011-06-28T21:47:24Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* VHDL Moduleinteilung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-06-28  22:00)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Übersicht.jpg|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Layout.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung2.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hardwarebeschreibungssprache VHDL==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.20 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company:                             FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer:                      Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:                         2011-06-28&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:                         ultraschall_1.1 &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description:             Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--                          wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
   Port (  clk :                         IN  std_logic;&lt;br /&gt;
           stopp :                       IN  std_logic;&lt;br /&gt;
           ultraschall :                 OUT  std_logic;&lt;br /&gt;
           lampe :                       OUT  std_logic;&lt;br /&gt;
           seg1 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg2 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg3 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg4 :                        out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal wegzaehler1 :                     STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal senderein :                       STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ultra :                           STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal einaus:                           STD_LOGIC_VECTOR (3 downto 0) :=&amp;quot;0000&amp;quot;;&lt;br /&gt;
signal startzaehler :                    STD_LOGIC_VECTOR (10 downto 0) :=&amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 :                            STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm :                          STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal mm:                               STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag:                             STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lampe &amp;lt;= not stopp;&lt;br /&gt;
ultraschall &amp;lt;=  einaus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk)                              --Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
&lt;br /&gt;
    clk2 &amp;lt;= clk2+1;                         --clk2 Zähl-Periode jetzt auf 50MHz	 &lt;br /&gt;
    if (clk2=728) then                      --auf 5mm einstellen: 0,005m * 50e6 Hz/ (343 m/s) = 729&lt;br /&gt;
        &lt;br /&gt;
        clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;             --doppelter Laufweg noch nicht berücksichtigt&lt;br /&gt;
&lt;br /&gt;
    end if;                                 --und 1011011000=728 weil er von 0 anfängt zu zählen&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )	                            --Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if einaus &amp;gt;= 14 then                    --14 da HIGH und LOW gezählt werden&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
			&lt;br /&gt;
    &lt;br /&gt;
    if clk2 = 728 then&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= startzaehler+1;     --Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=2047) then  --Periode der Messung (ca 30ms)&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (senderein = &#039;1&#039; ) then&lt;br /&gt;
&lt;br /&gt;
        ultra &amp;lt;= ultra+1;&lt;br /&gt;
&lt;br /&gt;
        if (ultra=625) then            -- 50MHz/40kHz/2= 625 Takte [2mal wegen ein/aus für Ultraschallkapsel 40kHz]&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= einaus + 1;      -- hier auch wirklich 625 Takte, weil er danach sofort eins dazuzählt&lt;br /&gt;
&lt;br /&gt;
            ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
        if einaus = 14 then            -- Rücksetzten&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=8) then           -- setzt alle ~30ms Zähler auf 0 zurück,1110 zusätzlich Trägheitsausgleich der Senderkapsel (offset)&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;      -- muss angepasst werden auf die jeweilige Spannung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (clk2 = 0) then                 -- erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= fivemm + 1;	       -- eigentliche Wegzählung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
		&lt;br /&gt;
    if (senderein=&#039;1&#039;) then            -- Bereit machen für Wertänderung&lt;br /&gt;
&lt;br /&gt;
        flag &amp;lt;= &#039;1&#039;;                   -- zeigt das Ultraschallimpuls unterwegs ist&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then                            --Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
        if (fivemm(10 downto 2) &amp;lt; 500) then                      -- Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
            if (fivemm(10 downto 2) &amp;gt; 2) then                    -- Zu nah dran -&amp;gt; alter Wert bleibt&lt;br /&gt;
                wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);  -- geteilt durch 2 wegen hin/zurück und 5mm extra&lt;br /&gt;
                mm &amp;lt;= fivemm(1);                                 -- 5mm&lt;br /&gt;
 &lt;br /&gt;
               wegzaehler1(9) &amp;lt;=&#039;0&#039;;&lt;br /&gt;
                flag &amp;lt;= &#039;0&#039;;                                     -- Impuls angekommen&lt;br /&gt;
            end if;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (fivemm=4095) then&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
        wegzaehler1(8 downto 0) &amp;lt;=&amp;quot;111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;			&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler2 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler3 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable m , dm , cm :    STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
cm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Meterberechnung&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 399) and (wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2:= wegzaehler1 - 400;		&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299) and (wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 300;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199) and (wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 200;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99) and (wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 100;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1;&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
    wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Dezimeterberechnung&lt;br /&gt;
if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -90;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -80;&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -70;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -60;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -50;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -40;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -30;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -20;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -10;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2;&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
    dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Zentimeterberechnung&lt;br /&gt;
if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    cm := wegzaehler3(3 downto 0);&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Millimeterberechnung				&lt;br /&gt;
CASE mm IS&lt;br /&gt;
    WHEN &#039;0&#039;    =&amp;gt; seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
&lt;br /&gt;
if (cm=&amp;quot;1111&amp;quot;) then   --falls Falscher Wert mm auf nichts&lt;br /&gt;
    seg4 &amp;lt;=&amp;quot;00000000&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
				&lt;br /&gt;
CASE cm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;		&lt;br /&gt;
END CASE;&lt;br /&gt;
		  &lt;br /&gt;
CASE dm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;&lt;br /&gt;
			&lt;br /&gt;
CASE m IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pinbelegung====&lt;br /&gt;
NET &amp;quot;clk&amp;quot;     LOC = AA12;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[0]&amp;quot; LOC = E15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[1]&amp;quot; LOC = E16;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[2]&amp;quot; LOC = A14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[3]&amp;quot; LOC = D14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[4]&amp;quot; LOC = D13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[5]&amp;quot; LOC = B13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[6]&amp;quot; LOC = E13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[7]&amp;quot; LOC = D15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[0]&amp;quot; LOC = B17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[1]&amp;quot; LOC = B18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[2]&amp;quot; LOC = A18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[3]&amp;quot; LOC = B15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[4]&amp;quot; LOC = D17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[5]&amp;quot; LOC = C17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[6]&amp;quot; LOC = E17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[7]&amp;quot; LOC = A19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[0]&amp;quot; LOC = D19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[1]&amp;quot; LOC = F18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[2]&amp;quot; LOC = C20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[3]&amp;quot; LOC = C19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[4]&amp;quot; LOC = C18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[5]&amp;quot; LOC = B19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[6]&amp;quot; LOC = D18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[7]&amp;quot; LOC = F17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[0]&amp;quot; LOC = F19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[1]&amp;quot; LOC = G17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[2]&amp;quot; LOC = E19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[3]&amp;quot; LOC = D21;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[4]&amp;quot; LOC = D20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[5]&amp;quot; LOC = E18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[6]&amp;quot; LOC = C22;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;stopp&amp;quot;   LOC = V10;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[7]&amp;quot; LOC = E20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;ultraschall&amp;quot; LOC = AB13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;lampe&amp;quot;   LOC = W2;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Anschluss_Signalverarbeitung.jpg&amp;diff=58230</id>
		<title>Datei:Anschluss Signalverarbeitung.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Anschluss_Signalverarbeitung.jpg&amp;diff=58230"/>
		<updated>2011-06-28T21:44:54Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Anschluss_FPGA.jpg&amp;diff=58229</id>
		<title>Datei:Anschluss FPGA.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Anschluss_FPGA.jpg&amp;diff=58229"/>
		<updated>2011-06-28T21:43:13Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=58228</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=58228"/>
		<updated>2011-06-28T19:50:15Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-06-28  22:00)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Übersicht.jpg|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Layout.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung2.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hardwarebeschreibungssprache VHDL==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.17 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company:                             FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer:                      Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:                         2011-06-28&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:                         ultraschall_1.1 &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description:             Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--                          wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
   Port (  clk :                         IN  std_logic;&lt;br /&gt;
           stopp :                       IN  std_logic;&lt;br /&gt;
           ultraschall :                 OUT  std_logic;&lt;br /&gt;
           lampe :                       OUT  std_logic;&lt;br /&gt;
           seg1 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg2 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg3 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg4 :                        out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal wegzaehler1 :                     STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal senderein :                       STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ultra :                           STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal einaus:                           STD_LOGIC_VECTOR (3 downto 0) :=&amp;quot;0000&amp;quot;;&lt;br /&gt;
signal startzaehler :                    STD_LOGIC_VECTOR (10 downto 0) :=&amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 :                            STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm :                          STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal mm:                               STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag:                             STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lampe &amp;lt;= not stopp;&lt;br /&gt;
ultraschall &amp;lt;=  einaus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk)                              --Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
&lt;br /&gt;
    clk2 &amp;lt;= clk2+1;                         --clk2 Zähl-Periode jetzt auf 50MHz	 &lt;br /&gt;
    if (clk2=728) then                      --auf 5mm einstellen: 0,005m * 50e6 Hz/ (343 m/s) = 729&lt;br /&gt;
        &lt;br /&gt;
        clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;             --doppelter Laufweg noch nicht berücksichtigt&lt;br /&gt;
&lt;br /&gt;
    end if;                                 --und 1011011000=728 weil er von 0 anfängt zu zählen&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )	                            --Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if einaus &amp;gt;= 14 then                    --14 da HIGH und LOW gezählt werden&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
			&lt;br /&gt;
    &lt;br /&gt;
    if clk2 = 728 then&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= startzaehler+1;     --Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=2047) then  --Periode der Messung (ca 30ms)&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (senderein = &#039;1&#039; ) then&lt;br /&gt;
&lt;br /&gt;
        ultra &amp;lt;= ultra+1;&lt;br /&gt;
&lt;br /&gt;
        if (ultra=625) then            -- 50MHz/40kHz/2= 625 Takte [2mal wegen ein/aus für Ultraschallkapsel 40kHz]&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= einaus + 1;      -- hier auch wirklich 625 Takte, weil er danach sofort eins dazuzählt&lt;br /&gt;
&lt;br /&gt;
            ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
        if einaus = 14 then            -- Rücksetzten&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=8) then           -- setzt alle ~30ms Zähler auf 0 zurück,1110 zusätzlich Trägheitsausgleich der Senderkapsel (offset)&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;      -- muss angepasst werden auf die jeweilige Spannung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (clk2 = 0) then                 -- erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= fivemm + 1;	       -- eigentliche Wegzählung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
		&lt;br /&gt;
    if (senderein=&#039;1&#039;) then            -- Bereit machen für Wertänderung&lt;br /&gt;
&lt;br /&gt;
        flag &amp;lt;= &#039;1&#039;;                   -- zeigt das Ultraschallimpuls unterwegs ist&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then                            --Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
        if (fivemm(10 downto 2) &amp;lt; 500) then                      -- Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
            if (fivemm(10 downto 2) &amp;gt; 2) then                    -- Zu nah dran -&amp;gt; alter Wert bleibt&lt;br /&gt;
                wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);  -- geteilt durch 2 wegen hin/zurück und 5mm extra&lt;br /&gt;
                mm &amp;lt;= fivemm(1);                                 -- 5mm&lt;br /&gt;
 &lt;br /&gt;
               wegzaehler1(9) &amp;lt;=&#039;0&#039;;&lt;br /&gt;
                flag &amp;lt;= &#039;0&#039;;                                     -- Impuls angekommen&lt;br /&gt;
            end if;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (fivemm=4095) then&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
        wegzaehler1(8 downto 0) &amp;lt;=&amp;quot;111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;			&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler2 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler3 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable m , dm , cm :    STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
cm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Meterberechnung&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 399) and (wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2:= wegzaehler1 - 400;		&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299) and (wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 300;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199) and (wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 200;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99) and (wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 100;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1;&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
    wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Dezimeterberechnung&lt;br /&gt;
if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -90;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -80;&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -70;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -60;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -50;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -40;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -30;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -20;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -10;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2;&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
    dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Zentimeterberechnung&lt;br /&gt;
if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    cm := wegzaehler3(3 downto 0);&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Millimeterberechnung				&lt;br /&gt;
CASE mm IS&lt;br /&gt;
    WHEN &#039;0&#039;    =&amp;gt; seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
&lt;br /&gt;
if (cm=&amp;quot;1111&amp;quot;) then   --falls Falscher Wert mm auf nichts&lt;br /&gt;
    seg4 &amp;lt;=&amp;quot;00000000&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
				&lt;br /&gt;
CASE cm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;		&lt;br /&gt;
END CASE;&lt;br /&gt;
		  &lt;br /&gt;
CASE dm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;&lt;br /&gt;
			&lt;br /&gt;
CASE m IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pinbelegung====&lt;br /&gt;
NET &amp;quot;clk&amp;quot;     LOC = AA12;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[0]&amp;quot; LOC = E15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[1]&amp;quot; LOC = E16;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[2]&amp;quot; LOC = A14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[3]&amp;quot; LOC = D14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[4]&amp;quot; LOC = D13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[5]&amp;quot; LOC = B13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[6]&amp;quot; LOC = E13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[7]&amp;quot; LOC = D15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[0]&amp;quot; LOC = B17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[1]&amp;quot; LOC = B18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[2]&amp;quot; LOC = A18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[3]&amp;quot; LOC = B15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[4]&amp;quot; LOC = D17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[5]&amp;quot; LOC = C17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[6]&amp;quot; LOC = E17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[7]&amp;quot; LOC = A19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[0]&amp;quot; LOC = D19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[1]&amp;quot; LOC = F18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[2]&amp;quot; LOC = C20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[3]&amp;quot; LOC = C19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[4]&amp;quot; LOC = C18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[5]&amp;quot; LOC = B19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[6]&amp;quot; LOC = D18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[7]&amp;quot; LOC = F17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[0]&amp;quot; LOC = F19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[1]&amp;quot; LOC = G17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[2]&amp;quot; LOC = E19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[3]&amp;quot; LOC = D21;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[4]&amp;quot; LOC = D20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[5]&amp;quot; LOC = E18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[6]&amp;quot; LOC = C22;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;stopp&amp;quot;   LOC = V10;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[7]&amp;quot; LOC = E20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;ultraschall&amp;quot; LOC = AB13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;lampe&amp;quot;   LOC = W2;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=58227</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=58227"/>
		<updated>2011-06-28T19:48:48Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-06-15  10:25)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Übersicht.jpg|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Layout.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung2.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hardwarebeschreibungssprache VHDL==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.17 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company:                             FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer:                      Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:                         2011-06-28&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:                         ultraschall_1.1 &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description:             Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--                          wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
   Port (  clk :                         IN  std_logic;&lt;br /&gt;
           stopp :                       IN  std_logic;&lt;br /&gt;
           ultraschall :                 OUT  std_logic;&lt;br /&gt;
           lampe :                       OUT  std_logic;&lt;br /&gt;
           seg1 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg2 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg3 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg4 :                        out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal wegzaehler1 :                     STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal senderein :                       STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ultra :                           STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal einaus:                           STD_LOGIC_VECTOR (3 downto 0) :=&amp;quot;0000&amp;quot;;&lt;br /&gt;
signal startzaehler :                    STD_LOGIC_VECTOR (10 downto 0) :=&amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 :                            STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm :                          STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal mm:                               STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag:                             STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lampe &amp;lt;= not stopp;&lt;br /&gt;
ultraschall &amp;lt;=  einaus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk)                              --Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
&lt;br /&gt;
    clk2 &amp;lt;= clk2+1;                         --clk2 Zähl-Periode jetzt auf 50MHz	 &lt;br /&gt;
    if (clk2=728) then                      --auf 5mm einstellen: 0,005m * 50e6 Hz/ (343 m/s) = 729&lt;br /&gt;
        &lt;br /&gt;
        clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;             --doppelter Laufweg noch nicht berücksichtigt&lt;br /&gt;
&lt;br /&gt;
    end if;                                 --und 1011011000=728 weil er von 0 anfängt zu zählen&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )	                            --Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if einaus &amp;gt;= 14 then                    --14 da HIGH und LOW gezählt werden&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
			&lt;br /&gt;
    &lt;br /&gt;
    if clk2 = 728 then&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= startzaehler+1;     --Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=2047) then  --Periode der Messung (ca 30ms)&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (senderein = &#039;1&#039; ) then&lt;br /&gt;
&lt;br /&gt;
        ultra &amp;lt;= ultra+1;&lt;br /&gt;
&lt;br /&gt;
        if (ultra=625) then            -- 50MHz/40kHz/2= 625 Takte [2mal wegen ein/aus für Ultraschallkapsel 40kHz]&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= einaus + 1;      -- hier auch wirklich 625 Takte, weil er danach sofort eins dazuzählt&lt;br /&gt;
&lt;br /&gt;
            ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
        if einaus = 14 then            -- Rücksetzten&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=8) then           -- setzt alle ~30ms Zähler auf 0 zurück,1110 zusätzlich Trägheitsausgleich der Senderkapsel (offset)&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;      -- muss angepasst werden auf die jeweilige Spannung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (clk2 = 0) then                 -- erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= fivemm + 1;	       -- eigentliche Wegzählung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
		&lt;br /&gt;
    if (senderein=&#039;1&#039;) then            -- Bereit machen für Wertänderung&lt;br /&gt;
&lt;br /&gt;
        flag &amp;lt;= &#039;1&#039;;                   -- zeigt das Ultraschallimpuls unterwegs ist&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then                            --Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
        if (fivemm(10 downto 2) &amp;lt; 500) then                      -- Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
            if (fivemm(10 downto 2) &amp;gt; 2) then                    -- Zu nah dran -&amp;gt; alter Wert bleibt&lt;br /&gt;
                wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);  -- geteilt durch 2 wegen hin/zurück und 5mm extra&lt;br /&gt;
                mm &amp;lt;= fivemm(1);                                 -- 5mm&lt;br /&gt;
 &lt;br /&gt;
               wegzaehler1(9) &amp;lt;=&#039;0&#039;;&lt;br /&gt;
                flag &amp;lt;= &#039;0&#039;;                                     -- Impuls angekommen&lt;br /&gt;
            end if;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (fivemm=4095) then&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
        wegzaehler1(8 downto 0) &amp;lt;=&amp;quot;111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;			&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler2 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler3 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable m , dm , cm :    STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
cm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Meterberechnung&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 399) and (wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2:= wegzaehler1 - 400;		&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299) and (wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 300;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199) and (wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 200;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99) and (wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 100;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1;&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
    wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Dezimeterberechnung&lt;br /&gt;
if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -90;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -80;&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -70;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -60;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -50;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -40;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -30;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -20;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -10;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2;&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
    dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Zentimeterberechnung&lt;br /&gt;
if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    cm := wegzaehler3(3 downto 0);&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Millimeterberechnung				&lt;br /&gt;
CASE mm IS&lt;br /&gt;
    WHEN &#039;0&#039;    =&amp;gt; seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
&lt;br /&gt;
if (cm=&amp;quot;1111&amp;quot;) then   --falls Falscher Wert mm auf nichts&lt;br /&gt;
    seg4 &amp;lt;=&amp;quot;00000000&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
				&lt;br /&gt;
CASE cm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;		&lt;br /&gt;
END CASE;&lt;br /&gt;
		  &lt;br /&gt;
CASE dm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;&lt;br /&gt;
			&lt;br /&gt;
CASE m IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pinbelegung====&lt;br /&gt;
NET &amp;quot;clk&amp;quot;     LOC = AA12;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[0]&amp;quot; LOC = E15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[1]&amp;quot; LOC = E16;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[2]&amp;quot; LOC = A14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[3]&amp;quot; LOC = D14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[4]&amp;quot; LOC = D13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[5]&amp;quot; LOC = B13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[6]&amp;quot; LOC = E13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[7]&amp;quot; LOC = D15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[0]&amp;quot; LOC = B17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[1]&amp;quot; LOC = B18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[2]&amp;quot; LOC = A18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[3]&amp;quot; LOC = B15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[4]&amp;quot; LOC = D17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[5]&amp;quot; LOC = C17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[6]&amp;quot; LOC = E17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[7]&amp;quot; LOC = A19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[0]&amp;quot; LOC = D19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[1]&amp;quot; LOC = F18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[2]&amp;quot; LOC = C20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[3]&amp;quot; LOC = C19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[4]&amp;quot; LOC = C18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[5]&amp;quot; LOC = B19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[6]&amp;quot; LOC = D18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[7]&amp;quot; LOC = F17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[0]&amp;quot; LOC = F19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[1]&amp;quot; LOC = G17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[2]&amp;quot; LOC = E19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[3]&amp;quot; LOC = D21;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[4]&amp;quot; LOC = D20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[5]&amp;quot; LOC = E18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[6]&amp;quot; LOC = C22;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;stopp&amp;quot;   LOC = V10;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[7]&amp;quot; LOC = E20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;ultraschall&amp;quot; LOC = AB13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;lampe&amp;quot;   LOC = W2;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:%C3%9Cbersicht.jpg&amp;diff=58226</id>
		<title>Datei:Übersicht.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:%C3%9Cbersicht.jpg&amp;diff=58226"/>
		<updated>2011-06-28T19:48:02Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: Ultraschallentfernungsmessung mit FPGA&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ultraschallentfernungsmessung mit FPGA&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=58225</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=58225"/>
		<updated>2011-06-28T19:40:22Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* VHDL-CODE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-06-15  10:25)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Layout.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung2.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hardwarebeschreibungssprache VHDL==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.17 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company:                             FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer:                      Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:                         2011-06-28&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:                         ultraschall_1.1 &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description:             Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--                          wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
   Port (  clk :                         IN  std_logic;&lt;br /&gt;
           stopp :                       IN  std_logic;&lt;br /&gt;
           ultraschall :                 OUT  std_logic;&lt;br /&gt;
           lampe :                       OUT  std_logic;&lt;br /&gt;
           seg1 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg2 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg3 :                        out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
           seg4 :                        out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal wegzaehler1 :                     STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal senderein :                       STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ultra :                           STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal einaus:                           STD_LOGIC_VECTOR (3 downto 0) :=&amp;quot;0000&amp;quot;;&lt;br /&gt;
signal startzaehler :                    STD_LOGIC_VECTOR (10 downto 0) :=&amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 :                            STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm :                          STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal mm:                               STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag:                             STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lampe &amp;lt;= not stopp;&lt;br /&gt;
ultraschall &amp;lt;=  einaus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk)                              --Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
&lt;br /&gt;
    clk2 &amp;lt;= clk2+1;                         --clk2 Zähl-Periode jetzt auf 50MHz	 &lt;br /&gt;
    if (clk2=728) then                      --auf 5mm einstellen: 0,005m * 50e6 Hz/ (343 m/s) = 729&lt;br /&gt;
        &lt;br /&gt;
        clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;             --doppelter Laufweg noch nicht berücksichtigt&lt;br /&gt;
&lt;br /&gt;
    end if;                                 --und 1011011000=728 weil er von 0 anfängt zu zählen&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )	                            --Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if einaus &amp;gt;= 14 then                    --14 da HIGH und LOW gezählt werden&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
			&lt;br /&gt;
    &lt;br /&gt;
    if clk2 = 728 then&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= startzaehler+1;     --Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
    &lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=2047) then  --Periode der Messung (ca 30ms)&lt;br /&gt;
&lt;br /&gt;
        startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (senderein = &#039;1&#039; ) then&lt;br /&gt;
&lt;br /&gt;
        ultra &amp;lt;= ultra+1;&lt;br /&gt;
&lt;br /&gt;
        if (ultra=625) then            -- 50MHz/40kHz/2= 625 Takte [2mal wegen ein/aus für Ultraschallkapsel 40kHz]&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= einaus + 1;      -- hier auch wirklich 625 Takte, weil er danach sofort eins dazuzählt&lt;br /&gt;
&lt;br /&gt;
            ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
        if einaus = 14 then            -- Rücksetzten&lt;br /&gt;
&lt;br /&gt;
            einaus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
    if (startzaehler=8) then           -- setzt alle ~30ms Zähler auf 0 zurück,1110 zusätzlich Trägheitsausgleich der Senderkapsel (offset)&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;      -- muss angepasst werden auf die jeweilige Spannung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (clk2 = 0) then                 -- erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
&lt;br /&gt;
        fivemm &amp;lt;= fivemm + 1;	       -- eigentliche Wegzählung&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
		&lt;br /&gt;
    if (senderein=&#039;1&#039;) then            -- Bereit machen für Wertänderung&lt;br /&gt;
&lt;br /&gt;
        flag &amp;lt;= &#039;1&#039;;                   -- zeigt das Ultraschallimpuls unterwegs ist&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then                            --Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
        if (fivemm(10 downto 2) &amp;lt; 500) then                      -- Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
            if (fivemm(10 downto 2) &amp;gt; 2) then                    -- Zu nah dran -&amp;gt; alter Wert bleibt&lt;br /&gt;
                wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);  -- geteilt durch 2 wegen hin/zurück und 5mm extra&lt;br /&gt;
                mm &amp;lt;= fivemm(1);                                 -- 5mm&lt;br /&gt;
 &lt;br /&gt;
               wegzaehler1(9) &amp;lt;=&#039;0&#039;;&lt;br /&gt;
                flag &amp;lt;= &#039;0&#039;;                                     -- Impuls angekommen&lt;br /&gt;
            end if;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (fivemm=4095) then&lt;br /&gt;
        fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
        wegzaehler1(8 downto 0) &amp;lt;=&amp;quot;111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
end if;			&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler2 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable wegzaehler3 :    STD_LOGIC_VECTOR (9 downto 0) := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
variable m , dm , cm :    STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
cm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Meterberechnung&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 399) and (wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2:= wegzaehler1 - 400;		&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299) and (wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 300;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199) and (wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 200;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99) and (wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1 - 100;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
&lt;br /&gt;
    m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler2 := wegzaehler1;&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
    wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Dezimeterberechnung&lt;br /&gt;
if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -90;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -80;&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -70;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -60;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -50;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -40;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -30;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -20;&lt;br /&gt;
&lt;br /&gt;
elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2 -10;&lt;br /&gt;
&lt;br /&gt;
elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := wegzaehler2;&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
    dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Zentimeterberechnung&lt;br /&gt;
if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
&lt;br /&gt;
    cm := wegzaehler3(3 downto 0);&lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
    cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
end if;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Millimeterberechnung				&lt;br /&gt;
CASE mm IS&lt;br /&gt;
    WHEN &#039;0&#039;    =&amp;gt; seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
&lt;br /&gt;
if (cm=&amp;quot;1111&amp;quot;) then   --falls Falscher Wert mm auf nichts&lt;br /&gt;
    seg4 &amp;lt;=&amp;quot;00000000&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
				&lt;br /&gt;
CASE cm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;		&lt;br /&gt;
END CASE;&lt;br /&gt;
		  &lt;br /&gt;
CASE dm IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;&lt;br /&gt;
			&lt;br /&gt;
CASE m IS&lt;br /&gt;
    WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
    WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
    WHEN OTHERS =&amp;gt;      seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
END CASE;	&lt;br /&gt;
					&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pinbelegung====&lt;br /&gt;
NET &amp;quot;clk&amp;quot;     LOC = AA12;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[0]&amp;quot; LOC = E15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[1]&amp;quot; LOC = E16;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[2]&amp;quot; LOC = A14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[3]&amp;quot; LOC = D14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[4]&amp;quot; LOC = D13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[5]&amp;quot; LOC = B13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[6]&amp;quot; LOC = E13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[7]&amp;quot; LOC = D15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[0]&amp;quot; LOC = B17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[1]&amp;quot; LOC = B18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[2]&amp;quot; LOC = A18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[3]&amp;quot; LOC = B15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[4]&amp;quot; LOC = D17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[5]&amp;quot; LOC = C17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[6]&amp;quot; LOC = E17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[7]&amp;quot; LOC = A19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[0]&amp;quot; LOC = D19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[1]&amp;quot; LOC = F18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[2]&amp;quot; LOC = C20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[3]&amp;quot; LOC = C19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[4]&amp;quot; LOC = C18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[5]&amp;quot; LOC = B19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[6]&amp;quot; LOC = D18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[7]&amp;quot; LOC = F17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[0]&amp;quot; LOC = F19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[1]&amp;quot; LOC = G17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[2]&amp;quot; LOC = E19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[3]&amp;quot; LOC = D21;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[4]&amp;quot; LOC = D20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[5]&amp;quot; LOC = E18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[6]&amp;quot; LOC = C22;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;stopp&amp;quot;   LOC = V10;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[7]&amp;quot; LOC = E20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;ultraschall&amp;quot; LOC = AB13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;lampe&amp;quot;   LOC = W2;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=58137</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=58137"/>
		<updated>2011-06-24T19:11:13Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-06-15  10:25)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Layout.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung2.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hardwarebeschreibungssprache VHDL==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.17 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pinbelegung====&lt;br /&gt;
NET &amp;quot;clk&amp;quot;     LOC = AA12;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[0]&amp;quot; LOC = E15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[1]&amp;quot; LOC = E16;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[2]&amp;quot; LOC = A14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[3]&amp;quot; LOC = D14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[4]&amp;quot; LOC = D13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[5]&amp;quot; LOC = B13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[6]&amp;quot; LOC = E13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[7]&amp;quot; LOC = D15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[0]&amp;quot; LOC = B17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[1]&amp;quot; LOC = B18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[2]&amp;quot; LOC = A18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[3]&amp;quot; LOC = B15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[4]&amp;quot; LOC = D17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[5]&amp;quot; LOC = C17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[6]&amp;quot; LOC = E17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[7]&amp;quot; LOC = A19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[0]&amp;quot; LOC = D19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[1]&amp;quot; LOC = F18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[2]&amp;quot; LOC = C20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[3]&amp;quot; LOC = C19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[4]&amp;quot; LOC = C18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[5]&amp;quot; LOC = B19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[6]&amp;quot; LOC = D18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[7]&amp;quot; LOC = F17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[0]&amp;quot; LOC = F19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[1]&amp;quot; LOC = G17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[2]&amp;quot; LOC = E19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[3]&amp;quot; LOC = D21;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[4]&amp;quot; LOC = D20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[5]&amp;quot; LOC = E18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[6]&amp;quot; LOC = C22;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;stopp&amp;quot;   LOC = V10;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[7]&amp;quot; LOC = E20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;ultraschall&amp;quot; LOC = AB13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;lampe&amp;quot;   LOC = W2;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=57953</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=57953"/>
		<updated>2011-06-15T21:38:53Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-06-15  10:25)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Layout.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung2.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.17 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pinbelegung====&lt;br /&gt;
NET &amp;quot;clk&amp;quot;     LOC = AA12;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[0]&amp;quot; LOC = E15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[1]&amp;quot; LOC = E16;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[2]&amp;quot; LOC = A14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[3]&amp;quot; LOC = D14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[4]&amp;quot; LOC = D13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[5]&amp;quot; LOC = B13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[6]&amp;quot; LOC = E13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[7]&amp;quot; LOC = D15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[0]&amp;quot; LOC = B17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[1]&amp;quot; LOC = B18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[2]&amp;quot; LOC = A18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[3]&amp;quot; LOC = B15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[4]&amp;quot; LOC = D17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[5]&amp;quot; LOC = C17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[6]&amp;quot; LOC = E17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[7]&amp;quot; LOC = A19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[0]&amp;quot; LOC = D19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[1]&amp;quot; LOC = F18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[2]&amp;quot; LOC = C20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[3]&amp;quot; LOC = C19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[4]&amp;quot; LOC = C18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[5]&amp;quot; LOC = B19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[6]&amp;quot; LOC = D18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[7]&amp;quot; LOC = F17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[0]&amp;quot; LOC = F19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[1]&amp;quot; LOC = G17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[2]&amp;quot; LOC = E19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[3]&amp;quot; LOC = D21;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[4]&amp;quot; LOC = D20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[5]&amp;quot; LOC = E18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[6]&amp;quot; LOC = C22;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;stopp&amp;quot;   LOC = V10;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[7]&amp;quot; LOC = E20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;ultraschall&amp;quot; LOC = AB13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;lampe&amp;quot;   LOC = W2;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55916</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55916"/>
		<updated>2011-03-17T09:35:09Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Gesamter Schaltplan und Aufbau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-03-17  10:25)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Layout.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung2.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.17 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pinbelegung====&lt;br /&gt;
NET &amp;quot;clk&amp;quot;     LOC = AA12;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[0]&amp;quot; LOC = E15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[1]&amp;quot; LOC = E16;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[2]&amp;quot; LOC = A14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[3]&amp;quot; LOC = D14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[4]&amp;quot; LOC = D13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[5]&amp;quot; LOC = B13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[6]&amp;quot; LOC = E13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[7]&amp;quot; LOC = D15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[0]&amp;quot; LOC = B17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[1]&amp;quot; LOC = B18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[2]&amp;quot; LOC = A18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[3]&amp;quot; LOC = B15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[4]&amp;quot; LOC = D17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[5]&amp;quot; LOC = C17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[6]&amp;quot; LOC = E17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[7]&amp;quot; LOC = A19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[0]&amp;quot; LOC = D19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[1]&amp;quot; LOC = F18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[2]&amp;quot; LOC = C20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[3]&amp;quot; LOC = C19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[4]&amp;quot; LOC = C18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[5]&amp;quot; LOC = B19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[6]&amp;quot; LOC = D18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[7]&amp;quot; LOC = F17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[0]&amp;quot; LOC = F19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[1]&amp;quot; LOC = G17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[2]&amp;quot; LOC = E19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[3]&amp;quot; LOC = D21;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[4]&amp;quot; LOC = D20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[5]&amp;quot; LOC = E18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[6]&amp;quot; LOC = C22;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;stopp&amp;quot;   LOC = V10;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[7]&amp;quot; LOC = E20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;ultraschall&amp;quot; LOC = AB13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;lampe&amp;quot;   LOC = W2;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Signalverarbeitung2.JPG&amp;diff=55915</id>
		<title>Datei:Signalverarbeitung2.JPG</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Signalverarbeitung2.JPG&amp;diff=55915"/>
		<updated>2011-03-17T09:34:53Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55914</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55914"/>
		<updated>2011-03-17T09:27:10Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-03-17  10:25)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Layout.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.17 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pinbelegung====&lt;br /&gt;
NET &amp;quot;clk&amp;quot;     LOC = AA12;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[0]&amp;quot; LOC = E15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[1]&amp;quot; LOC = E16;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[2]&amp;quot; LOC = A14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[3]&amp;quot; LOC = D14;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[4]&amp;quot; LOC = D13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[5]&amp;quot; LOC = B13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[6]&amp;quot; LOC = E13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg1[7]&amp;quot; LOC = D15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[0]&amp;quot; LOC = B17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[1]&amp;quot; LOC = B18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[2]&amp;quot; LOC = A18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[3]&amp;quot; LOC = B15;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[4]&amp;quot; LOC = D17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[5]&amp;quot; LOC = C17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[6]&amp;quot; LOC = E17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg2[7]&amp;quot; LOC = A19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[0]&amp;quot; LOC = D19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[1]&amp;quot; LOC = F18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[2]&amp;quot; LOC = C20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[3]&amp;quot; LOC = C19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[4]&amp;quot; LOC = C18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[5]&amp;quot; LOC = B19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[6]&amp;quot; LOC = D18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg3[7]&amp;quot; LOC = F17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[0]&amp;quot; LOC = F19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[1]&amp;quot; LOC = G17;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[2]&amp;quot; LOC = E19;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[3]&amp;quot; LOC = D21;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[4]&amp;quot; LOC = D20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[5]&amp;quot; LOC = E18;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[6]&amp;quot; LOC = C22;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;stopp&amp;quot;   LOC = V10;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;seg4[7]&amp;quot; LOC = E20;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;ultraschall&amp;quot; LOC = AB13;&amp;lt;br&amp;gt;&lt;br /&gt;
NET &amp;quot;lampe&amp;quot;   LOC = W2;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55913</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55913"/>
		<updated>2011-03-17T09:21:03Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-03-17  10:25)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Layout.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.17 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55912</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55912"/>
		<updated>2011-03-17T09:19:21Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Gesamter Schaltplan und Aufbau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-03-15&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Layout.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.17 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55911</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55911"/>
		<updated>2011-03-17T09:19:10Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Gesamter Schaltplan und Aufbau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-03-15&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Layout.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.17 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55910</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55910"/>
		<updated>2011-03-17T09:18:57Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Gesamter Schaltplan */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-03-15&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan und Aufbau===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Layout.png|miniatur|right| Abb.18 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Signalverarbeitung.JPG|left|miniatur|Abb.17 Aufbau]]&lt;br /&gt;
[[Bild:Bestückungsplan.png|miniatur|right| Abb.19 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.17 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Signalverarbeitung.JPG&amp;diff=55909</id>
		<title>Datei:Signalverarbeitung.JPG</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Signalverarbeitung.JPG&amp;diff=55909"/>
		<updated>2011-03-17T09:17:14Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55908</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55908"/>
		<updated>2011-03-17T09:09:10Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Gesamter Schaltplan */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-03-15&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Layout.png|miniatur|right| Abb.17 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Bestückungsplan.png|miniatur|right| Abb.18 Bestückungsplan ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.17 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55907</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55907"/>
		<updated>2011-03-17T09:07:30Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Gesamter Schaltplan */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-03-15&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|left|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
[[Bild:Layout.png|miniatur|right| Abb.17 Layout (Platinenrückseite) ]]&lt;br /&gt;
[[Bild:Bestückungsplan.png|miniatur|right| Abb.18 Bestückungsplan ]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.17 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Layout.png&amp;diff=55906</id>
		<title>Datei:Layout.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Layout.png&amp;diff=55906"/>
		<updated>2011-03-17T09:05:06Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Best%C3%BCckungsplan.png&amp;diff=55905</id>
		<title>Datei:Bestückungsplan.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Best%C3%BCckungsplan.png&amp;diff=55905"/>
		<updated>2011-03-17T08:58:09Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55455</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55455"/>
		<updated>2011-03-01T19:20:57Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-03-15&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|center|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.17 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55044</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55044"/>
		<updated>2011-02-13T14:41:50Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* VHDL Moduleinteilung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-02-20&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|center|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.17 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55043</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55043"/>
		<updated>2011-02-13T14:41:30Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Gesamter Schaltplan */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-02-20&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|center|miniatur|Abb.16 Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.15 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55042</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55042"/>
		<updated>2011-02-13T14:40:39Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Anpassung der Spannung für das FPGA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-02-20&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Prinzip Pegelanpassung ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.15 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|center|miniatur| Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.15 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55041</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55041"/>
		<updated>2011-02-13T14:40:07Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Anpassung der Spannung für das FPGA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-02-20&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur|Abb.14 Gesamter Schaltplan ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.14 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|center|miniatur| Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.15 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55040</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55040"/>
		<updated>2011-02-13T14:38:42Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Erzeugung einer RC-Kurve zur Filterung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-02-20&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.12 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.13 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur| Gesamter Schaltplan ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.14 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|center|miniatur| Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.15 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55039</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55039"/>
		<updated>2011-02-13T14:38:21Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Realisierung im Schaltplan */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-02-20&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.11 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.11 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.12 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur| Gesamter Schaltplan ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.14 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|center|miniatur| Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.15 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55038</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55038"/>
		<updated>2011-02-13T14:38:00Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Prinzip des Moduls */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-02-20&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.10 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.10 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.11 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.12 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur| Gesamter Schaltplan ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.14 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|center|miniatur| Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.15 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55037</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55037"/>
		<updated>2011-02-13T14:37:41Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Realisierung im Schaltplan */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-02-20&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.8 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.9 Großsignalersatzschaltbild zu Abb.8 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.9 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.10 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.11 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.12 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur| Gesamter Schaltplan ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.14 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|center|miniatur| Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.15 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55036</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55036"/>
		<updated>2011-02-13T14:37:08Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Prinzip des Moduls */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-02-20&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.7 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.7 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.8 Großsignalersatzschaltbild zu Abb.7 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.9 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.10 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.11 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.12 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur| Gesamter Schaltplan ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.14 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|center|miniatur| Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.15 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55035</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55035"/>
		<updated>2011-02-13T14:36:51Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Spannungsversorgung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-02-20&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.6 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.6 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.7 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.8 Großsignalersatzschaltbild zu Abb.7 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.9 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.10 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.11 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.12 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur| Gesamter Schaltplan ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.14 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|center|miniatur| Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.15 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55034</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55034"/>
		<updated>2011-02-13T14:36:29Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* FPGA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-02-20&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|left| Abb.4 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|right| Abb.5 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.3 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.6 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.7 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.8 Großsignalersatzschaltbild zu Abb.7 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.9 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.10 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.11 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.12 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur| Gesamter Schaltplan ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.14 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|center|miniatur| Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.15 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55033</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55033"/>
		<updated>2011-02-13T14:35:53Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Sender-, Empfängerkapsel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-02-20&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.3 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|right| Abb.3 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|left| Abb.4 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.3 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.6 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.7 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.8 Großsignalersatzschaltbild zu Abb.7 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.9 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.10 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.11 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.12 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur| Gesamter Schaltplan ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.14 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|center|miniatur| Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.15 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55032</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55032"/>
		<updated>2011-02-13T14:35:33Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Idee */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-02-20&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.2 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.2 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|right| Abb.3 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|left| Abb.4 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.3 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.6 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.7 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.8 Großsignalersatzschaltbild zu Abb.7 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.9 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.10 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.11 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.12 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur| Gesamter Schaltplan ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.14 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|center|miniatur| Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.15 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55031</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55031"/>
		<updated>2011-02-13T14:34:52Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2011-02-13  03:35)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
-&amp;gt;Code verändern laut Diskussion über diese Seite&lt;br /&gt;
-&amp;gt;Wird alles voraussichtlich erledigt bis 2011-02-20&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.1 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.2 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|right| Abb.3 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|left| Abb.4 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.3 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.6 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.7 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.8 Großsignalersatzschaltbild zu Abb.7 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.9 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.10 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.11 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.12 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur| Gesamter Schaltplan ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.14 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|center|miniatur| Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.15 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55030</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=55030"/>
		<updated>2011-02-13T14:30:33Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2010-12-29  01:20)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Gesamtbild fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ultra_gesamtansicht.JPG|right|miniatur| Abb.1 Gesamtansicht ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.1 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.2 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|right| Abb.3 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|left| Abb.4 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.3 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.6 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.7 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.8 Großsignalersatzschaltbild zu Abb.7 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.9 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.10 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.11 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.12 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur| Gesamter Schaltplan ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.14 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|center|miniatur| Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.15 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Ultra_gesamtansicht.JPG&amp;diff=55029</id>
		<title>Datei:Ultra gesamtansicht.JPG</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Ultra_gesamtansicht.JPG&amp;diff=55029"/>
		<updated>2011-02-13T14:28:19Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=53918</id>
		<title>Ultraschallentfernungsmessung mittels FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ultraschallentfernungsmessung_mittels_FPGA&amp;diff=53918"/>
		<updated>2010-12-29T17:11:46Z</updated>

		<summary type="html">&lt;p&gt;Feldweg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von Thomas Eichstetter, Nicole Elsner ; Mentor:  Dr.Ing. MBA Thomas Fuhrmann &lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist ein Anfängerprojekt.&lt;br /&gt;
&lt;br /&gt;
Noch in Bearbeitung (Stand:2010-12-29  01:20)&lt;br /&gt;
-&amp;gt;Anbindung an das FPGA fehlt noch&lt;br /&gt;
-&amp;gt;Gesamtbild fehlt noch&lt;br /&gt;
-&amp;gt;Layout fehlt noch&lt;br /&gt;
-&amp;gt;Komplette Doku auf PDF noch uploaden&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Zugegeben, das Projekt „Ultraschall-Entfernungsmessung“ findet sich in&lt;br /&gt;
diversen Variationen an einigen Stellen im Netz. Warum haben wir nun das&lt;br /&gt;
gleiche Ziel, aber wollen es wieder in einer abgewandelten Form vorstellen? Als&lt;br /&gt;
Studenten im Bereich Elektro- und Informationstechnik ist es uns besonders&lt;br /&gt;
wichtig, die teilweise sehr theoretisch aufgebauten Vorlesungen durch&lt;br /&gt;
praktische Aufgaben zu vertiefen. Neben den grundsätzlichen Dingen wie&lt;br /&gt;
Erstellen einer Platine und Anwendung deren Bausteine, lag es uns auch am&lt;br /&gt;
Herzen die bisher sehr rudimentären VHDL-Kenntnisse auszubauen und in&lt;br /&gt;
einem praktischen Projekt anzuwenden. Damit ist ein neues Projekt geboren,&lt;br /&gt;
das zwar ähnlich bereits existiert, aber nur in unserer Form angemessen auf&lt;br /&gt;
unser Studium eingeht.&lt;br /&gt;
&lt;br /&gt;
!!!BILD GESAMTANSICHT!!!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine gewisse Grundausrüstung ist Voraussetzung für das Gelingen des&lt;br /&gt;
Projektes. So gehört ein Oszilloskop ebenso zum Equipment wie die Materialen&lt;br /&gt;
zum Herstellen einer Platine und Programme zum Erstellen von Schaltnetzen&lt;br /&gt;
und Simulationen. Diese Programme stehen im Internet teilweise kostenlos zur&lt;br /&gt;
verfügung. Als kostspieligerer Bestandteil ist das FPGA (Field Programmable&lt;br /&gt;
Gate Array) zu nennen, welches auf einem Evaluationsboard angebracht und&lt;br /&gt;
mit entsprechender Entwicklungsumgebung für das folgende Projekt geeignet&lt;br /&gt;
ist.&lt;br /&gt;
&lt;br /&gt;
Um das hier beschriebene Projekt nachzustellen, wird folgende Ausrüstung&lt;br /&gt;
benötigt:&lt;br /&gt;
&lt;br /&gt;
* SwitcherCAD IV LTSpice&lt;br /&gt;
* EAGLE Layout Editor&lt;br /&gt;
* Xilinx 9.1 ISE&lt;br /&gt;
* Xilinx Spartan – 3&lt;br /&gt;
* diverse Bauteile (darunter Z-Diode, Operationsverstärker, Transistoren)&lt;br /&gt;
* Ultraschallsender und -empfänger&lt;br /&gt;
* Spannungsversorgung&lt;br /&gt;
* analoges oder digitales Oszilloskop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als besonders nützlich hat sich ein Multimeter und Funktionsgenerator gezeigt.&lt;br /&gt;
Grundkenntnisse in Schaltungstechnik, Berechnungen in elektrischer&lt;br /&gt;
Netzwerke, Bauelemente und VHDL sind hilfreich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Präbeginn ==&lt;br /&gt;
&lt;br /&gt;
===Idee===&lt;br /&gt;
[[Bild:schallreflexion1.jpg|right|miniatur| Abb.1 Reflexionsdarstellung des Schalls ]]&lt;br /&gt;
Eine Sendekapsel erzeugt Schall, der an einem beliebigen Objekt reflektiert und von einer Empfängerkapsel aufgenommen wird. Durch Messung der Laufzeit, Dauer von Senden bis zum Empfangen, kann unter Berücksichtigung der Schallgeschwindigkeit die Entfernung des Objektes bestimmt werden. Diese zeitliche Differenz wird durch das FPGA und die selbst erstellte Platine aufgenommen und weiterverarbeitet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schnittstellen festlegen===&lt;br /&gt;
Um verschiedene Teilprojekte erfolgreich miteinander zu verknüpfen, wird zu Anfang die Schnittstelle festgelegt, die sich hier zwischen der selbsterstellten Platine und dem FPGA befindet. An der Schnittstelle liegen zwei zu definierende Signale an, Sendeimpuls und Empfangssignal, die wie folgt aus Sicht des FPGAs festgelegt sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Sendeimpulse || 1 Ausgangssignal mit CMOS-Pegel Positive Logik  || 7 Rechteckimpulse auf 3,3V mit f=40kHz ungefähr alle 30ms&lt;br /&gt;
|-&lt;br /&gt;
| Empfangssignal || 1 Eingangssingal mit CMOS-Pegel Positive Logik || Highimpuls erst bei Erhalten des Echos, spätere Impulse zwischen dem ersten&lt;br /&gt;
Highimpuls und der nächsten Sendesequenz haben keinen Einfluss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Essentielle Bausteine===&lt;br /&gt;
====Sender-, Empfängerkapsel====&lt;br /&gt;
[[Bild:ultraschallkapsel.jpg|right|miniatur| Abb.2 Ultraschallkapsel ]]&lt;br /&gt;
Bei dem Ultraschallempfänger bzw. -sender wird der piezoelektrische Effekt genutzt. Der sogenannte Piezokristall wechselwirkt mit Spannung, beginnt dadurch seine Form zu ändern und sende Schallwellen aus. Wird hingegen Schall empfangen, so tritt eine Änderung der elektrischen Polarisation auf und Spannung wird erzeugt.&lt;br /&gt;
Bei der Ultraschallentfernungsmessung benötigen wir beide Fälle, sowohl die&lt;br /&gt;
Erzeugung von Schall, als auch Detektion.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FPGA====&lt;br /&gt;
[[Bild:fpga.jpg|miniatur|right| Abb.3 FPGA ]]&lt;br /&gt;
[[Bild:eval-board.jpg|miniatur|left| Abb.4 Evaluationsboard ]]&lt;br /&gt;
Die CMOS Komponenten im konfigurierbaren Logikbaustein erhalten durch das Programm den Befehl sich auf bestimmte Weise zu verschalten. Damit werden unterschiedliche Gatter (AND, NOR, usw.) realisiert, die zusammen die Hardware des Programmes darstellen.&lt;br /&gt;
Ein großer Vorteil des FPGA gegenüber Mikrocontrollern ist die Unabhängigkeit der Anzahl der Messungen vom Timer, da im mehrere Messungen parallel laufen können. Dadurch ist es einfacher das Projekt weiter auszubauen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operationsverstärker====&lt;br /&gt;
Dieses Bauteil kann auf simple Weise sämtliche Verstärkungseigenschaften&lt;br /&gt;
entwickeln. So ist eine Verwendung als Komparator, Filter, Verstärker,&lt;br /&gt;
Integrator usw. möglich. Im vorgestellten Projekt werden invertierende&lt;br /&gt;
Verstärker und Komparatoren benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufteilung in Module - Baukastenprinzip==&lt;br /&gt;
Um die Übersicht besonders bei großen Projekten nicht zu verlieren, ist es ratsam das Netzwerk in einzelne Module zu unterteilen und diese Stück für Stück zu entwickeln. Erst wenn das einzelne Teilprojekt einsatzbereit ist, wird es mit den Übrigen verknüpft. So wird gewährleistet, dass Fehler im Modul nicht in andere Bereiche einfließen und damit schwer festzustellende Störungen verursacht.&lt;br /&gt;
&lt;br /&gt;
===Spannungsversorgung===&lt;br /&gt;
[[Bild:spannungsversorgung.jpg|right|miniatur| Abb.3 FPGA ]]&lt;br /&gt;
Diese Schaltungsteile sind zuständig für die Spannungsversorgung der Bauteile. Mit den Kondensatoren C5 und C6 wird sichergestellt, dass die Betriebsspannung durch kurze Stromimpulse nicht zusammenbricht. Als Ursache dieses Problems ist ein evtl. hoher Innenwiderstand der Spannungsversorgung zu nennen. Die Diode D2 schützt die Schaltung vor falscher Polung.&lt;br /&gt;
&lt;br /&gt;
Mit den zwei Widerständen R7 und R8 wird die Versorgungsspannung VCC halbiert und als neues Bezugspotential VCC/2 verwendet. Die Schwingung der Eingangssignale bewegt sich damit um dieses Potential. Der damit entstandene Offset von VCC/2 kann später durch den Kondensator C3 wieder entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Versorgungsspannung festgelegt ist, wird der Komparator IC2A (vgl. Bild 12) als Ausgangsbauteil für die Funktionalität verwendet. Mit dem korrekten Verlauf der RC-Kurve werden die unerwünschten Signale gefiltert und das auszuwertende Signal weitergeleitet. Im Folgenden werden die beiden Signale getrennt betrachtet.&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Senders===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_sendevorgang.jpg|right|miniatur| Abb.6 Sendesignallaufprinzip ]]&lt;br /&gt;
Mehrere kurz aufeinander folgende Impulse gewährleisten ein ausreichendes Aufladen des Kondensators. Da das FPGA aber nur mit 3,3 V und kleinen Strömen arbeitet, werden die Impulse mit Transistoren verstärkt um die Sendekapsel ausreichend versorgen zu können.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:verstaerkerschaltplan_sender.jpg|right|miniatur| Abb.7 Verstärkerschaltplan für Ultraschallsender ]]&lt;br /&gt;
[[Bild:ersatzschaltbild_sender.jpg|right|miniatur| Abb.8 Großsignalersatzschaltbild zu Abb.7 ]]&lt;br /&gt;
Es werden pro Entfernungsmessung sieben Sendeimpulse vom FPGA geliefert und mit den beiden Transistoren T1 und Q1 verstärkt. Damit ist gewährleistet, dass die Intensität ausreicht um die Senderkapsel zum Senden zu bewegen. Außerdem wird der Kondensator C1 geladen. Weil nur Impulse verstärkt werden, können die Transistoren im Sättigungsbereich betrieben werden, um die größtmögliche Verstärkung zu erreichen. Nachdem aus dem Datenblatt der Transistoren die Stromverstärkungsfaktoren entnommen sind, wird der Basisstrom so dimensioniert, dass die Transistoren im übersteuerten Bereich arbeiten. Es hat sich gezeigt, dass durch die Diffusionskapazitäten der Transistoren jeder Impuls verlängert wird. Um diesen Effekt zu verringern, werden die Transistoren nicht zu weit im Sättigungsbereich betrieben.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verstärkung des Empfängers===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_empfangsvorgang.jpg|right|miniatur| Abb.9 Empfangssignallaufprinzip ]]&lt;br /&gt;
Erste Probemessungen an der Empfängerkapsel zeigen am Oszilloskop nur sehr geringe Ausschläge. Da es während der Signalverarbeitung zum Rauschen durch besonders hochohmige Widerstände innerhalb der Schaltung kommt, wird das Signal verstärkt um es in einen Spannungsbereich zu bringen, der sich deutlich von ungewollten Nebeneffekten abhebt. Zur Veranschaulichung einer weiteren Variante zur Verstärkung, wird am Empfänger ein Operationsverstärker, statt eines einfachen Transistors, verwendet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_empfaenger.jpg|right|miniatur| Abb.10 Verstärkerschaltplan für Ultraschallempfänger ]]&lt;br /&gt;
Trotz dem optimalisierten Sender-Empfangssystem mit gleicher Resonanzfrequenz von 40 kHz muss das nach der Reflexion des Ultraschalls nur schwache Echo verstärkt werden, um weiterverarbeitet werden zu können.&lt;br /&gt;
&lt;br /&gt;
Die Ersatzschaltbilder von Ultraschallsender und –empfänger sind identisch. Die Stromquelle des Senders bleibt jedoch auf Null, während die des Empfängers bei Empfang aktiv wird. Um Störungen durch Rauschen am hohen Innenwiderstand der Ultraschallkapsel zu vermeiden, wird an beiden Anschlüssen des Empfängers das gleiche Potential angelegt.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker IC1A dient als Vorverstärker und Filter. In dieser invertierenden Beschaltung verstärkt er die Eingangssignale um das zehnfache und filtert alle Schwingungen ab 48 kHz. heraus. Um die empfangenen Signale weiterzugeben und gleichzeitig jeden Gleichanteil abzutrennen wird der Kondensator C3 eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die zweite Stufe mit IC1B ist ebenfalls als invertierender Verstärker aufgebaut und kann erneut um Faktor zehn verstärken. Dies läst sich über das Potentiometer R12 stufenlos einstellen. Zudem lässt sich der Gleichanteil mit R14 in geringen Bereichen um VCC/2 variieren, um die Empfangskurve exakt mit der RC-Kurve abzugleichen. Das Audio-Signal am Ausgang des Operationsverstärkers IC1B, schwingt um nahezu dasselbe Potential, wie das Signal am nichtinvertierenden Eingang.&lt;br /&gt;
&lt;br /&gt;
===Erzeugung einer RC-Kurve zur Filterung===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_signalfilterung.jpg|right|miniatur| Abb.11 Prinzip der Signalfilterung ]]&lt;br /&gt;
Aus der Richtcharakteristik ist zu entnehmen, wie stark der Ultraschall neben der Hauptrichtung auch in andere Richtungen abstrahlt. Auf ähnliche Weise empfängt auch der Empfänger aus dem gesamten Raum Signale. Da Sender- und Empfängerkapsel dicht nebeneinander verbaut sind und der ausgesendete Schall nicht nur durch Reflexion zum Empfänger gelangt, sondern auch auf direktem Wege durch seitliche Abstrahlung während der Messung, ist es notwendig die bei der Sendung seitlich abgestrahlten Impulse herauszufiltern. Das wird durch den Vergleich mit einer RC-Entladungskurve erreicht. Während die Senderkapsel die Impulse erhält, wird parallel dazu ein Kondensator aufgeladen. Ist der Sendevorgang abgeschlossen, entlädt sich dieser Kondensator über einen Widerstand. In einem Operationsverstärker wird diese Entladekurve mit dem Signal des verstärkten Ultraschalleingangs verglichen. Seitlich emittierter Ultraschall fällt beim Empfangen unter die RC-Kurve und wird dadurch nicht verwertet. Beim Auftreffen des senkrecht reflektierten Schalls ist die RC-Kurve ausreichend abgefallen um einer komplikationslosen Messung nicht mehr im Wege zu stehen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_signalfilterung.jpg|right|miniatur| Abb.12 Schaltplan zur Signalfilterung ]]&lt;br /&gt;
Der Fluss der Ladung in den Kondensator legt die Spannungserhöhung gegenüber der anderen Kondensatorplatte fest. Wie viel Ladung in den Kondensator fließt wird mit dem Potentiometer R5 eingestellt. Das Potential an der unteren Kondensatorseite liegt bei der halben Betriebsspannung. Beim Entladevorgang, also nach den 7 Sendeimpulsen, wird die erhöhte Ladungsansammlung auf der oberen Kondensatorplatte über den Widerstand R6 zur unteren Platte geleitet. Die Diode D1 verhindert ein zusätzliches Entladen durch R4 und den Ultraschallsender. Da der Eingangswiderstand des Operationsverstärkers sehr groß ist, findet auch darüber kaum eine Entladung statt. Dadurch ergibt sich eine typische Entladekurve mit der Zeitkonstante τ=R6*C1. Diese Kurve nähert sich asymptotisch der halben Betriebsspannung an.&lt;br /&gt;
Der Operationsverstärker IC2A dient als Komparator zwischen RC-Kurve und dem Audio-Signal. Sobald das Potential des Audio-Singals höher ist als das der RC-Kurve, schaltet der Ausgang nahezu auf Betriebsspannung.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anpassung der Spannung für das FPGA===&lt;br /&gt;
====Prinzip des Moduls====&lt;br /&gt;
[[Bild:prinzip_pegelanpassung.jpg|right|miniatur| Gesamter Schaltplan ]]&lt;br /&gt;
Da das FPGA im CMOS-Pegel von 0 – 3,3 V arbeitet und im Normalfall eine&lt;br /&gt;
höhere Spannung am Ausgang es Komparators anliegt, ist eine Reduzierung&lt;br /&gt;
der Spannung nötig. Eine parallel zum FPGA - Eingang geschaltete Z-Diode&lt;br /&gt;
reduziert die Spannung auf die gewünschten 3,3 V.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Realisierung im Schaltplan====&lt;br /&gt;
[[Bild:schaltplan_pegelanpassung.jpg|right|miniatur| Abb.14 Schaltplan für Spannungspegelanpassung an FPGA]]&lt;br /&gt;
Die Spannung am FPGA muss auf 3,3 V reguliert werden. Deshalb wird das&lt;br /&gt;
Ausgabepotential des Operationsverstärkers verwendet, um einen PNP-&lt;br /&gt;
Transistor zu schalten. Der Operationsverstärker IC2A kann nicht bis zur&lt;br /&gt;
oberen und unteren Betriebsspannung (0V und VCC) aussteuern. Hat der&lt;br /&gt;
Operationsverstärker auf maximales positives Potential geschalten, kann der&lt;br /&gt;
Transistor BC328 noch teilweise Strom durchlassen. Um den Transistor sicher&lt;br /&gt;
zu sperren, wird mit dem Widerstand R16 das Potential auf nahezu VCC&lt;br /&gt;
gebracht. Der andere Fall, dass der Operationsverstärker gegen GND schaltet,&lt;br /&gt;
veranlasst das Öffnen des PNP-Transistors und lässt damit genügend Strom&lt;br /&gt;
durch die Zener-Diode fließen, welche das Potential am FPGA_EINGANG auf&lt;br /&gt;
3,3V beschränkt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gesamter Schaltplan===&lt;br /&gt;
[[Bild:schaltplan_gesamt.png|center|miniatur| Schaltplan der kompletter Signalaufbereitung]]&lt;br /&gt;
&lt;br /&gt;
==Softwareentwicklung==&lt;br /&gt;
&lt;br /&gt;
===VHDL Einleitung===&lt;br /&gt;
VHDL ist eine hardwarebeschreibende Sprache. Damit wird dem FPGA&lt;br /&gt;
vorgegeben, welche Verkettung der CMOS Bauteile freigegeben wird um die in&lt;br /&gt;
VHDL eingegebenen Befehle in Hardware umzusetzen. Alle Signaldurchläufe&lt;br /&gt;
durch das FPGA werden parallel ausgeführt, das macht das FPGA sehr&lt;br /&gt;
leistungsstark. Es ist jedoch auch möglich Prozesse mit sequenzieller Struktur&lt;br /&gt;
in VHDL zu realisieren. In unserem Fall wurden beide Arten der&lt;br /&gt;
Signallaufstrukur gewählt. Um verschiedene externe Signale miteinander zu&lt;br /&gt;
verbinden, werden interne Signale definiert.&lt;br /&gt;
&lt;br /&gt;
===VHDL Moduleinteilung===&lt;br /&gt;
Ein komplettes VHDL-Programm setzt sich aus einzelnen Modulen zusammen,&lt;br /&gt;
welche miteinander verknüpft sind. Diese Art von Programm ist für&lt;br /&gt;
Teamarbeiten sehr gut geeignet, da die Aufteilung von Modulen an&lt;br /&gt;
verschiedene Entwickler einfach möglich ist. Ein besonderes Augenmerk sollte&lt;br /&gt;
dabei auf die Festlegung der Schnittstellen und Übergabewerte gelegt werden.&lt;br /&gt;
Für das Ultraschallprojekt wurden die Module wie folgt festgelegt:&lt;br /&gt;
[[Bild:vhdl_modulbeschreibung.jpg|center|miniatur| Abb.15 VHDL Modulaufteilungsplan]]&lt;br /&gt;
&lt;br /&gt;
Die externen Signale sind blau markiert und wurden schon beschrieben.&lt;br /&gt;
====VHDL Modulschnitstellen====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! || Signalart || Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| clk2 || 10Bit-Block, STD_LOGIC_VECTOR  || Zählt mit 25MHz hoch bis „1011011000“ und wirdanschließend auf „0000000000“ zurückgesetzt&lt;br /&gt;
|-&lt;br /&gt;
| startzähler || 11Bit-Block, STD_LOGIC_VECTOR || Zählt für Schallgeschwindigkeit alle 5mm um eine Stelle hoch&lt;br /&gt;
|-&lt;br /&gt;
| einaus || 4Bit-Block, STD_LOGIC_VECTOR || Enthält die Flankenwechsel der Ultraschallimpulse&lt;br /&gt;
|-&lt;br /&gt;
| sender_ein || 1Bit-Wert, STD_LOGIC || Wenn 1 dann soll der Ultraschallsender die 7 Sendeimpulse bekommen&lt;br /&gt;
|-&lt;br /&gt;
| wegzähler1 || 10Bit-Block, STD_LOGIC_VECTOR || Zählt nach Offsetkorrektur für Schallgeschwindigkeit in 1 cm Schritten&lt;br /&gt;
|-&lt;br /&gt;
| mm || 1Bit-Wert, STD_LOGIC || Wechselt für Schallgeschwindigkeit in 5mm Schritten seinen Wert&lt;br /&gt;
|-&lt;br /&gt;
| seg1 - seg4 || jeweils 8Bit-Wert, STD_LOGIC_VECTOR || Gibt den BCD-Wert jeder Anzeigestelle an; seg1 für Meter, seg2 für Dezimeter, seg3 für Zentimeter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====VHDL-CODE====&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
-- Company: 			FH-Regensburg	&lt;br /&gt;
-- Azubi-Engineer: 		Thomas Eichstetter	&lt;br /&gt;
-- &lt;br /&gt;
-- Create Date:    		02:05:21 11/10/2009 &lt;br /&gt;
-- Facelift			12:60:00 12/08/2010&lt;br /&gt;
--&lt;br /&gt;
-- Design Name: 		&lt;br /&gt;
-- Module Name:    		ultraschall - Behavioral &lt;br /&gt;
-- Project Name: &lt;br /&gt;
-- Target Devices: Spartan 3&lt;br /&gt;
-- Tool versions: &lt;br /&gt;
-- Description: 		Mittels Ultraschallimpuls und Laufzeitmessung über Reflexion&lt;br /&gt;
--				wird die Entfernung zu einem Objekt bestimmt&lt;br /&gt;
--&lt;br /&gt;
-- Dependencies: &lt;br /&gt;
--&lt;br /&gt;
-- Revision: &lt;br /&gt;
-- Revision 0.01 - File Created&lt;br /&gt;
-- Additional Comments: &lt;br /&gt;
--&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
entity ultraschall is&lt;br /&gt;
	Port (  clk : 			IN  std_logic;&lt;br /&gt;
		stopp : 		IN  std_logic;&lt;br /&gt;
		ultraschall : 		out  std_logic;&lt;br /&gt;
		seg1 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg2 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg3 : 			out  STD_LOGIC_VECTOR (7 downto 0);&lt;br /&gt;
		seg4 : 			out  STD_LOGIC_VECTOR (7 downto 0));&lt;br /&gt;
end ultraschall;&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of ultraschall is&lt;br /&gt;
&lt;br /&gt;
signal senderein :   		STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal mm: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal flag: 			STD_LOGIC := &#039;0&#039;;&lt;br /&gt;
signal ein_aus:			STD_LOGIC_VECTOR (3 downto 0)  := &amp;quot;0000&amp;quot;;&lt;br /&gt;
signal ultra :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal wegzaehler1 :   		STD_LOGIC_VECTOR (9 downto 0)  := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
signal startzaehler :  		STD_LOGIC_VECTOR (10 downto 0) := &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
signal clk2 : 			STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
signal fivemm : 		STD_LOGIC_VECTOR (11 downto 0) := &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
begin					--Parallel Laufende Anweisungen:&lt;br /&gt;
&lt;br /&gt;
ultraschall &amp;lt;=  ein_aus(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					--Verschiedene Prozelle laufen parallel&lt;br /&gt;
					--zueiander sequenziell ab&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler1: Zählprozess&lt;br /&gt;
process ( clk, clk2)			--Timer wird auf 5mm Weg/Periode gesetzt &amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler1&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then	&lt;br /&gt;
	clk2 &amp;lt;= clk2+&amp;quot;000000000001&amp;quot;;	--clk2 Zähl-Periode jetzt auf 25MHz&lt;br /&gt;
		&lt;br /&gt;
	if (clk2=&amp;quot;1011011000&amp;quot;) then	--auf 5mm einstellen: 343m/s * (728 steps / 50MHz) 1011011000&lt;br /&gt;
		clk2 &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler2: Ereignis-Zeitpunkt-Prozess&lt;br /&gt;
process ( clk )			--Ultraschallimpuls wird erzeugt (7 Impulse bei 40kHz)&amp;quot;&amp;quot;&amp;quot;&amp;quot;Zähler2&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
	if ein_aus &amp;gt;= &amp;quot;1110&amp;quot; then&lt;br /&gt;
		senderein &amp;lt;= &#039;0&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if clk2 = &amp;quot;000000000000&amp;quot; then&lt;br /&gt;
		startzaehler &amp;lt;= startzaehler+&amp;quot;00000000001&amp;quot;;	--Zähler der jeweils in 5mm-Steps zählt&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (startzaehler=&amp;quot;11111111111&amp;quot;) then			--Periode der Messung&lt;br /&gt;
		startzaehler &amp;lt;= &amp;quot;00000000000&amp;quot;;&lt;br /&gt;
		senderein &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler4: Ultraschalltimer&lt;br /&gt;
process ( clk )&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;0&#039; then&lt;br /&gt;
	if (senderein = &#039;1&#039; ) then&lt;br /&gt;
		ultra &amp;lt;= ultra+&amp;quot;0000000001&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if (ultra=&amp;quot;1001110001&amp;quot;) then		-- 40kHz = 50MHz /(2* 625) [2mal wegen ein/aus]&lt;br /&gt;
			ein_aus &amp;lt;= ein_aus + 1;&lt;br /&gt;
			ultra &amp;lt;=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
		if ein_aus = &amp;quot;1110&amp;quot; then		-- Rücksetzten&lt;br /&gt;
			ein_aus &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Zähler3: Wegzähler und Offsetkorrektur&lt;br /&gt;
process (clk)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
if clk&#039;event and clk=&#039;1&#039; then&lt;br /&gt;
	if (startzaehler=&amp;quot;00000001110&amp;quot;) then		--setzt alle ~30ms Zähler auf 0 zurück,&lt;br /&gt;
								--1110 -&amp;gt; zusätzlich Trägheitsausgleich&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
	&lt;br /&gt;
	if (clk2=&amp;quot;000000000000&amp;quot;) then			--erhöht jeden bestimmten Zeitabschnitt um 5mm&lt;br /&gt;
		fivemm &amp;lt;= fivemm + &amp;quot;000000000001&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
		&lt;br /&gt;
	if (senderein=&#039;1&#039;) then				-- Bereit machen für Wertänderung&lt;br /&gt;
		flag &amp;lt;= &#039;1&#039;;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (stopp=&#039;1&#039;  and flag=&#039;1&#039;) then		--Wertänderung der zuletzt gemessenen Länge&lt;br /&gt;
		if (fivemm(10 downto 2) &amp;lt; 500) then	--Zu weit weg -&amp;gt; alter Wert bleibt&lt;br /&gt;
			wegzaehler1(8 downto 0) &amp;lt;= fivemm(10 downto 2);		&lt;br /&gt;
						        --geteilt durch 2 da hin/zurück und &lt;br /&gt;
							--5mm-Schritte extra ausgewertet wird&lt;br /&gt;
			mm &amp;lt;= fivemm(1);		--5mm-Schritte &lt;br /&gt;
			wegzaehler1(9) &amp;lt;=&#039;0&#039;;		--signed-zeichen löschen&lt;br /&gt;
			flag &amp;lt;= &#039;0&#039;;&lt;br /&gt;
		end if;&lt;br /&gt;
	end if;&lt;br /&gt;
&lt;br /&gt;
	if (fivemm=&amp;quot;111111111111&amp;quot;) then		&lt;br /&gt;
		fivemm &amp;lt;= &amp;quot;000000000000&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
end if;		&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
--Dual-&amp;gt;BCD WAndler: Auswertung der Dualzahl und Ausgabe auf vier 7-Segmentanzeigen&lt;br /&gt;
PROCESS ( wegzaehler1 , mm)&lt;br /&gt;
variable wegzaehler2 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable wegzaehler3 :   STD_LOGIC_VECTOR (9 downto 0) :=&amp;quot;0000000000&amp;quot;;&lt;br /&gt;
variable m , dm , cm: STD_LOGIC_VECTOR (3 downto 0) := &amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
wegzaehler2 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
wegzaehler3 := &amp;quot;0000000000&amp;quot;;&lt;br /&gt;
m:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
dm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
cm:=&amp;quot;0000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--erste Ziffer&lt;br /&gt;
if ((wegzaehler1(8 downto 0) &amp;gt; 500)) then&lt;br /&gt;
	m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
	wegzaehler2 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 399)and(wegzaehler1(8 downto 0) &amp;lt; 500)) then&lt;br /&gt;
	m := &amp;quot;0100&amp;quot;;&lt;br /&gt;
	wegzaehler2:= wegzaehler1 + &amp;quot;0001110000&amp;quot;;		--400 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 299)and(wegzaehler1(8 downto 0) &amp;lt; 400)) then&lt;br /&gt;
	m := &amp;quot;0011&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0011010100&amp;quot;;		--300 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 199)and(wegzaehler1(8 downto 0) &amp;lt; 300)) then&lt;br /&gt;
	m := &amp;quot;0010&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0100111000&amp;quot;;		--200 abziehen&lt;br /&gt;
elsif ((wegzaehler1(8 downto 0) &amp;gt; 99)and(wegzaehler1(8 downto 0) &amp;lt; 200)) then&lt;br /&gt;
	m := &amp;quot;0001&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1 + &amp;quot;0110011100&amp;quot;;		--100 abziehen&lt;br /&gt;
elsif (wegzaehler1(8 downto 0) &amp;lt; 100) then&lt;br /&gt;
	m := &amp;quot;0000&amp;quot;;&lt;br /&gt;
	wegzaehler2 := wegzaehler1;&lt;br /&gt;
else m := &amp;quot;1111&amp;quot;;&lt;br /&gt;
end if;&lt;br /&gt;
	&lt;br /&gt;
wegzaehler2(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--zweite Ziffer&lt;br /&gt;
	if ((wegzaehler2(8 downto 0) &amp;gt; 89)and(wegzaehler2(8 downto 0) &amp;lt; 100)) then&lt;br /&gt;
		dm := &amp;quot;1001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110100110&amp;quot;;		--90 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 79)and(wegzaehler2(8 downto 0) &amp;lt; 90)) then&lt;br /&gt;
		dm := &amp;quot;1000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110110000&amp;quot;;		--80 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 69)and(wegzaehler2(8 downto 0) &amp;lt; 80)) then&lt;br /&gt;
		dm := &amp;quot;0111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0110111010&amp;quot;;		--70 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 59)and(wegzaehler2(8 downto 0) &amp;lt; 70)) then&lt;br /&gt;
		dm := &amp;quot;0110&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111000100&amp;quot;;		--60 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 49)and(wegzaehler2(8 downto 0) &amp;lt; 60)) then&lt;br /&gt;
		dm := &amp;quot;0101&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111001110&amp;quot;;		--50 abziehen		&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 39)and(wegzaehler2(8 downto 0) &amp;lt; 50)) then&lt;br /&gt;
		dm := &amp;quot;0100&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111011000&amp;quot;;		--40 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 29)and(wegzaehler2(8 downto 0) &amp;lt; 40)) then&lt;br /&gt;
		dm := &amp;quot;0011&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111100010&amp;quot;;		--30 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 19)and(wegzaehler2(8 downto 0) &amp;lt; 30)) then&lt;br /&gt;
		dm := &amp;quot;0010&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111101100&amp;quot;;		--20 abziehen&lt;br /&gt;
	elsif ((wegzaehler2(8 downto 0) &amp;gt; 9)and(wegzaehler2(8 downto 0) &amp;lt; 20)) then&lt;br /&gt;
		dm := &amp;quot;0001&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2 + &amp;quot;0111110110&amp;quot;;		--10 abziehen&lt;br /&gt;
	elsif (wegzaehler2(8 downto 0) &amp;lt; 10) then&lt;br /&gt;
		dm := &amp;quot;0000&amp;quot;;&lt;br /&gt;
		wegzaehler3 := wegzaehler2;&lt;br /&gt;
	else dm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		wegzaehler3 := &amp;quot;1111111111&amp;quot;;&lt;br /&gt;
	end if;&lt;br /&gt;
			&lt;br /&gt;
wegzaehler3(9) :=&#039;0&#039;;		--signed löschen&lt;br /&gt;
				--dritte Ziffer	&lt;br /&gt;
		if (wegzaehler3 &amp;lt; 10) then&lt;br /&gt;
			cm := wegzaehler3(3 downto 0);&lt;br /&gt;
		else cm := &amp;quot;1111&amp;quot;;&lt;br /&gt;
		end if;&lt;br /&gt;
				--vierte Ziffer nur zwei Werte möglich (0/5)			&lt;br /&gt;
				--Ausgabe des Wertes&lt;br /&gt;
			CASE mm IS&lt;br /&gt;
				WHEN &#039;0&#039; =&amp;gt;      seg4 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; seg4 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
			END CASE;				&lt;br /&gt;
		&lt;br /&gt;
			CASE cm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg3 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg3 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
		  &lt;br /&gt;
			CASE dm IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;00000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg2 &amp;lt;= &amp;quot;01101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg2 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;&lt;br /&gt;
			&lt;br /&gt;
			CASE m IS&lt;br /&gt;
				WHEN &amp;quot;0000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0010&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11011011&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0011&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11001111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0100&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11100110&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0101&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0110&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111101&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;0111&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;10000111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1000&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11111111&amp;quot;;&lt;br /&gt;
				WHEN &amp;quot;1001&amp;quot; =&amp;gt;      seg1 &amp;lt;= &amp;quot;11101111&amp;quot;;&lt;br /&gt;
				WHEN OTHERS =&amp;gt; 	  seg1 &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
			END CASE;			&lt;br /&gt;
	&lt;br /&gt;
END PROCESS ;&lt;br /&gt;
-----------------------------&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Funktionstest==&lt;br /&gt;
Natürlich ist es am einfachsten die Einstellung des Ultraschallsenders mit dem Oszilloskop nachzuvollziehen. Diese Anleitung soll aber vor allem dazu dienen, den Leuten eine Inbetriebnahme zu ermöglichen, die kein Oszilloskop zur Hand haben.&lt;br /&gt;
&lt;br /&gt;
Ganz allgemein ist jedem anzuraten, der Geräte neu einstellen will, wie auch bei der Modulentwicklung eine Reihenfolge zu verfolgen und Schritt für Schritt vorzugehen. Zur Vorbereitung sollten die Sensoren einigermaßen frei liegen und in ca. 30 cm Abstand ein flacher, parallel zu den Sensoren liegende Fläche stehen. Zu Anfang alle drei Potentiometer gegen den Uhrzeigersinn auf Anschlag drehen. Anschließend wird die Quelle (Netzgerät oder Batterien sind möglich) angeschlossen. Um die Bauteile nicht zu stark zu belasten und sie damit zu zerstören, ist eine Spannung von 5-20 V empfehlenswert. In der Testphase wurden 10 V verwendet, damit der Ultraschallimpuls ausreichend stark war.&lt;br /&gt;
&lt;br /&gt;
Die Potentiale am Eingang des Verstärkers IC2A liegen nah beieinander. Deshalb verändert man das Potentiometer R14 so lange, bis das FPGA das erste Mal einen Wert anzeigt. Damit ist der Offset des Signals knapp unterhalb des Spannungsendwertes der RC-Kurve. Vorsicht: Bitte darauf achten, dass man nicht zu weit dreht, denn das System ist diesbezüglich sehr empfindlich und größere Entfernungen nicht mehr einwandfrei gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
Dann Poti R5 langsam im Uhrzeigersinn drehen, bis der zu erwartende Messwert stabil angezeigt wird. Nun sollte der Ultraschallentfernungsmesser eingestellt sein um Entfernung messen zu können. Jetzt kann der Ultraschallentfernungsmesser auf ein zu messendes Objekt ausgerichtet werden. Mit R12 lässt sich die Verstärkung von um Faktor 10 variieren. Das ermöglicht es Hindernisse, welche neben der Messstrecke sind und schwache Signale zurücklaufen lassen, auszublenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazit==&lt;br /&gt;
Dieses Projekt der Ultraschallentfernungsmessung eignet sich hervorragend um&lt;br /&gt;
verschiedene Grundschaltungen innerhalb eines Netzwerkes besser zu&lt;br /&gt;
verstehen. Auch erste Schritte mit VHDL sind hiermit leicht zu realisieren.&lt;br /&gt;
Erfolge sind bereits während dem Projekt nach den einzelnen Abschnitten zu&lt;br /&gt;
erkennen. Durch die 7-Segment-Anzeigen ist die Funktionalität auch für&lt;br /&gt;
Anfänger leicht ersichtlich und der Ultraschallentfernungsmesser eignet sich&lt;br /&gt;
deshalb hervorragend als Vorführprojekt. Die Entfernungsmessung funktioniert&lt;br /&gt;
bis zu 4 m zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Sourcecode: http://www.mikrocontroller.net/attachment.php/123/Sourcecode.zip&lt;br /&gt;
* Schaltplan: http://www.mikrocontroller.net/attachment.php/1234/Schaltplan.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
!!!!!!!!!!!Schaltplan und Layout!!!!!!!!!!!&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/200976&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Feldweg</name></author>
	</entry>
</feed>