<?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=92.227.199.61</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=92.227.199.61"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/92.227.199.61"/>
	<updated>2026-04-10T14:41:48Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=FPGA_Lab&amp;diff=93771</id>
		<title>FPGA Lab</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=FPGA_Lab&amp;diff=93771"/>
		<updated>2016-08-25T21:51:26Z</updated>

		<summary type="html">&lt;p&gt;92.227.199.61: URLs fixed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das &#039;&#039;&#039;FPGA Lab&#039;&#039;&#039; ist ein FPGA-basiertes Signallabor für die [http://www.mikrocontroller.net/topic/122573 Spartan-3-FPGA-Karte aus dem c´t-Lab] und die dazugehörige DACRAM-Erweiterungskarte (Verweise zu diesem Projekt am Ende dieser Seite). Es kombiniert einen modulierbaren Mehrfach-[http://www.mikrocontroller.net/articles/DDS DDS]-Generator, einen Universalzähler für Frequenz- und Periodenmessungen sowie einen Pulsgenerator. Dazu gibt es bisher eine mit [http://www.ni.com/labview/ LabVIEW] entwickelte Bedienoberfläche sowie die .NET-Klassenbibliothek [[Ct Lab Client Library]]. Eine Anwendung für Windows ist geplant.&lt;br /&gt;
&lt;br /&gt;
== Technische Merkmale ==&lt;br /&gt;
&lt;br /&gt;
* Universalzähler (Frequenz-/Periodenmesser)&lt;br /&gt;
** Frequenz bis ca.&amp;amp;nbsp;150&amp;amp;nbsp;MHz, Periode bis ca.&amp;amp;nbsp;120&amp;amp;nbsp;Stunden&lt;br /&gt;
** einstellbare Messfrequenz bzw. Torzeit&lt;br /&gt;
** für Pulsgenerator, DDS-Kanal oder externes Signal&lt;br /&gt;
** Anzeige für Überlauf oder ausbleibendes Signal&lt;br /&gt;
&lt;br /&gt;
* Pulsgenerator&lt;br /&gt;
** getrennt einstellbare Puls- und Pausendauern jeweils von 10&amp;amp;nbsp;ns bis ca.&amp;amp;nbsp;40&amp;amp;nbsp;s&lt;br /&gt;
&lt;br /&gt;
* 4-kanaliger DDS-Signalgenerator&lt;br /&gt;
** Frequenz bis 50&amp;amp;nbsp;MHz&lt;br /&gt;
** Rechteck, Sägezahn (steigend oder fallend), Sinus&lt;br /&gt;
** einstellbare Amplitude und Phasenlage, separate Synchronisationsausgänge mit fester Phasenlage 0°&lt;br /&gt;
** jeder Kanal durch die anderen Kanäle in Amplitude, Frequenz und Phase modulierbar (auch gleichzeitig)&lt;br /&gt;
** jeder Kanal auf jeden anderen synchronisierbar&lt;br /&gt;
&lt;br /&gt;
* Ein- und Ausgänge&lt;br /&gt;
** externer Messeingang des Universalzählers&lt;br /&gt;
** zwei Analogausgänge für frei wählbare Quellen (Pulsgenerator oder DDS-Kanal) gleichzeitig&lt;br /&gt;
** ein Synchronisationsausgang je DDS-Kanal&lt;br /&gt;
** Ausgangs des Pulsgenerators&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI]-Slave zur Anbindung an einen Mikrocontroller&lt;br /&gt;
** mehrere addressierbare Register zum Setzen von Konfigurationswerten und Auslesen von Messwerten&lt;br /&gt;
&lt;br /&gt;
=== Universalzähler (Frequenz-/Periodenmesser) ===&lt;br /&gt;
&lt;br /&gt;
Dieser Zähler kann entweder die Frequenz eines internen oder externen Signals oder dessen Periodendauer messen. Die Bedienoberfläche errechnet aber auch den jeweils anderen Wert und zeigt beide zusammen an.&lt;br /&gt;
&lt;br /&gt;
==== Messmethode ====&lt;br /&gt;
&lt;br /&gt;
Bei der Frequenzmessung dient das zu messende Signal als Takt für den Zähler, ein internes Torsignal steuert die Dauer des Zählvorganges. Bei der Messung der Periodendauer wird der Zähler durch ein internes Signal getaktet, die steigenden Flanken des zu messenden Signals steuern wiederum die Zähldauer. Je nach Messmethode arbeitet der Zähler also in der Taktdomäne des externen Signals oder des Systemtakts, die zu- und abführenden Signale werden entsprechend synchronisiert.&lt;br /&gt;
&lt;br /&gt;
Der interne Zähler selbst wird durch das jeweils genutzte Torsignal weder gestoppt noch zurückgesetzt, er läuft ständig durch. Das Torsignal steuert lediglich das Auslesen des Zählers, der Messwert ergibt sich dann aus der Differenz des aktuellen und des vorangegangenen Auslesewertes. Das funktioniert auch bei einem Zählerüberlauf, solange danach der aktuelle Auslesewert den vorangegengenen nicht einholt. Der nutzbare Zählbereich hängt also nur von der Bitbreite des Zählers ab. Echte Überläufe dieses nutzbaren Bereiches werden erkannt und signalisiert.&lt;br /&gt;
&lt;br /&gt;
Da das Torsignal auf das Taktsignal einsynchronisiert wird, arbeitet die Ausleselogik bei fehlendem externen Signal nicht mehr, weder bei Frequenz- noch bei Periodenmessung. In diesem Fall wird weiterhin der Wert aus dem letzten Messzyklus ausgegeben. Eine Art Herzschlagsignal zeigt jedoch an, ob Messzyklen stattfinden oder nicht.&lt;br /&gt;
&lt;br /&gt;
==== Messbereiche ====&lt;br /&gt;
&lt;br /&gt;
Der interne Zähler ist 32 Bit breit. Messbereich und Auflösung ergeben sich theoretisch bei der Frequenzmessung direkt aus der Torzeit, bei der Periodenmessung aus der Zählfrequenz. Natürlich gibt es aber physikalische Grenzen, die theoretischen Obergrenzen für die Frequenzmessung können nicht annähernd erreicht werden. Beim eingesetzten FPGA sind Messungen bis über 150&amp;amp;nbsp;MHz möglich.&lt;br /&gt;
&lt;br /&gt;
Die tatsächlich unterstützten Messbereiche sind: &lt;br /&gt;
&lt;br /&gt;
* Frequenzmessung:&lt;br /&gt;
** Torzeit 10&amp;amp;nbsp;s (Auflösung 0,1&amp;amp;nbsp;Hz)&lt;br /&gt;
** Torzeit 1&amp;amp;nbsp;s (Auflösung 1&amp;amp;nbsp;Hz)&lt;br /&gt;
** Torzeit 0,1&amp;amp;nbsp;s (Auflösung 10&amp;amp;nbsp;Hz)&lt;br /&gt;
&lt;br /&gt;
* Periodendauer:&lt;br /&gt;
** Messfrequenz 10&amp;amp;nbsp;kHz (max&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;119&amp;amp;nbsp;Stunden, Auflösung&amp;amp;nbsp;100&amp;amp;nbsp;&amp;amp;mu;s)&lt;br /&gt;
** Messfrequenz 100&amp;amp;nbsp;kHz (max&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;11,9&amp;amp;nbsp;Stunden, Auflösung&amp;amp;nbsp;10&amp;amp;nbsp;&amp;amp;mu;s)&lt;br /&gt;
** Messfrequenz 1&amp;amp;nbsp;MHz (max&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;71&amp;amp;nbsp;Minuten, Auflösung&amp;amp;nbsp;1&amp;amp;nbsp;&amp;amp;mu;s)&lt;br /&gt;
** Messfrequenz 10&amp;amp;nbsp;MHz (max&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;7&amp;amp;nbsp;Minuten, Auflösung&amp;amp;nbsp;100&amp;amp;nbsp;ns)&lt;br /&gt;
&lt;br /&gt;
=== Pulsgenerator ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;&lt;br /&gt;
[[Datei:FPGA_Lab_Puls_20us-100us.JPG|thumb|150px|Pulssignal, Puls 20&amp;amp;nbsp;&amp;amp;mu;s, Pause 100&amp;amp;nbsp;&amp;amp;mu;s]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Generator kann ein Rechtecksignal bereitstellen, bei dem sich die Puls- und Pausendauern unabhängig voneinander jeweils von 10&amp;amp;nbsp;ns bis 42,9&amp;amp;nbsp;s einstellen lassen. Die Bedienoberfläche lässt sich derzeit allerdings nur bis 1&amp;amp;nbsp;s einstellen (das wird noch geändert).&lt;br /&gt;
&lt;br /&gt;
Es existieren mehrere Einstellbereiche:&lt;br /&gt;
* 10&amp;amp;nbsp;ns bis 1&amp;amp;nbsp;&amp;amp;mu;s (Auflösung 10&amp;amp;nbsp;ns)&lt;br /&gt;
* 1&amp;amp;nbsp;&amp;amp;mu;s bis 1&amp;amp;nbsp;ms (Auflösung 1&amp;amp;nbsp;&amp;amp;mu;s)&lt;br /&gt;
* 1&amp;amp;nbsp;ms bis 1&amp;amp;nbsp;s (Auflösung 1&amp;amp;nbsp;ms)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modulierbarer 4-Kanal-DDS-Generator ===&lt;br /&gt;
&lt;br /&gt;
Dieser nach dem [http://www.mikrocontroller.net/articles/DDS DDS]-Prinzip arbeitende Generator kann vier unabhängige Signale unterschiedlicher Kurvenformen bereitstellen, die sich vielfältig beeinflussen und untereinander auch modulieren lassen.&lt;br /&gt;
&lt;br /&gt;
==== Signalformen ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;&lt;br /&gt;
[[Datei:FPGA_Lab_Lissajous_2,5kHz-10kHz.JPG|thumb|150px|Lissajous-Figur mit zwei DDS-Kanälen, X-Kanal Sinus 2,5&amp;amp;nbsp;kHz, Y-Kanal  Sinus 10&amp;amp;nbsp;kHz]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;&lt;br /&gt;
[[Datei:FPGA_Lab_Sägezahn_10kHz.JPG|thumb|150px|Sägezahn 10&amp;amp;nbsp;kHz]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;&lt;br /&gt;
[[Datei:FPGA_Lab_Sinus_10kHz.JPG|thumb|150px|Sinus 10&amp;amp;nbsp;kHz]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeder der vier Kanäle kann symmetrische Rechtecksignale, steigende und fallende Sägezahnsignale sowie Sinussignale liefern. Die Rechteck- und Sägezahnsignale werden direkt aus dem aktuellen Wert des jeweiligen Phasenakkumulators ermittelt. Die Werte des Sinussignals werden einer Lookuptabelle entnommen, welche pro Periode 4096 Werte bereitstellt (wobei die Tabelle tatsächlich nur 1024 Werte für die erste Viertelperiode enthält, der Rest wird abgeleitet).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Frequenzbereich ====&lt;br /&gt;
&lt;br /&gt;
Die internen Phasenakkumulatoren werden mit 100&amp;amp;nbsp;MHz getaktet und sind 32 Bit breit, somit stehen grundsätzlich Frequenzen bis 50&amp;amp;nbsp;MHz bei einer Auflösung von 0,023&amp;amp;nbsp;Hz zur Verfügung. Die nutzbare Bandbreite hängt natürlich auch noch vom eingesetzten DA-Wandler und den Ausgangsverstärkern ab.&lt;br /&gt;
&lt;br /&gt;
==== Amplitude ====&lt;br /&gt;
&lt;br /&gt;
Die Amplitude ist vom invertierenden Maximum über Null bis zum nichtinvertierenden Maximum einstellbar. Die Wertauflösung beträgt für alle Signalformen 16 Bit bei maximaler Amplitude.&lt;br /&gt;
&lt;br /&gt;
==== Phasenlage ====&lt;br /&gt;
&lt;br /&gt;
Die Phasenlage kann in beide Richtungen um jeweils maximal eine Periode verschoben werden (&amp;amp;plusmn;2&amp;amp;pi; bzw. 360°). Die Auflösung über den gesamten Bereich von &amp;amp;plusmn;2&amp;amp;pi; beträgt intern 32 Bit, die Schnittstelle zur Bedienoberfläche nutzt davon derzeit aber nur 16 Bit. Jeder Kanal besitzt einen separaten Synchronisationsausgang, der ein symmetrisches Rechtecksignal liefert, dessen steigende Flanke immer bei Phasenlage 0° liegt. Außerdem kann jeder Kanal auf jeden anderen synchronisiert werden. Bei Phasenlage 0° der ausgewählten Synchronisationsquelle wird dabei der Phasenakkumulator des synchronisierten Kanals auf 0° gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Modulation ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;&lt;br /&gt;
[[Datei:FPGA_Lab_FM_1kHz-100Hz.JPG|thumb|150px|Frequenzmodulation, Träger Sinus 1&amp;amp;nbsp;kHz, Nutzsignal Sinus 100&amp;amp;nbsp;Hz, Frequenzhub 500&amp;amp;nbsp;Hz]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;&lt;br /&gt;
[[Datei:FPGA_Lab_AM_10kHz-1kHz.JPG |thumb|150px|Amplitudenmodulation, Träger Sinus 10&amp;amp;nbsp;kHz, Nutzsignal Sinus 1&amp;amp;nbsp;kHz, Modulation 50%]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeder Kanal lässt sich durch die anderen Kanäle unabhängig voneinander in Amplitude, Frequenz und Phase modulieren, auch gleichzeitig. Die Modulationstiefe lässt sich über die Amplitude des modulierenden Signals variieren. Die maximale Modulationstiefe umfasst bei Amplitudenmodulation (AM) den gesamten Spannungsumfang, bei Frequenzmodulation (FM) den gesamten Frequenzumfang (&amp;amp;plusmn;25&amp;amp;nbsp;MHz) in mehreren Bereichen und bei Phasenmodulation &amp;amp;plusmn;1/2&amp;amp;nbsp;Periode (&amp;amp;plusmn;&amp;amp;pi; bzw. 180°) ausgehend von der eingestellten Phasenlage. Bei Amplituden- und Frequenzmodulation zeigt die Bedienoberfläche an, wenn es zu einer Übermodulation kommt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ein- und Ausgänge ===&lt;br /&gt;
&lt;br /&gt;
Jeder der beiden Analogausgänge der DACRAM-Erweiterungskarte kann wahlweise  eines der vier DDS-Generatorsignale oder das Pulsgeneratorsignal ausgeben. Parallel dazu stehen die Synchronisationssignale aller vier DDS-Kanäle sowie das Signal des Pulsgenerators zur Verfügung. Die maximale Amplitude der Analogausgänge beträgt &amp;amp;plusmn;1,25&amp;amp;nbsp;V (2,5V&amp;lt;sub&amp;gt;ss&amp;lt;/sub&amp;gt;), die anderen Ausgänge haben LVTTL- bzw. LVCMOS33-Pegel. &lt;br /&gt;
&lt;br /&gt;
Auf der DACRAM-Erweiterungskarte sind zwei Bestückungsmöglichkeiten vorgesehen:&lt;br /&gt;
* 2-Kanal-DAC AD5447 mit 21 Megasamples und Verstärker AD8055&lt;br /&gt;
* TxDAC AD9752 (12&amp;amp;nbsp;Bit) oder AD9754 (14&amp;amp;nbsp;Bit) mit 125 Megasamples und Verstärker LT1818&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;FPGA Lab&#039;&#039;&#039; wurde mit der ersten Variante getestet, auch die Bilder wurden damit gemacht.&lt;br /&gt;
&lt;br /&gt;
Der Eingang des Universalzählers sowie die Analogausgänge sind über die DACRAM-Karte zugänglich. Die zusätzlichen Digitalsignale sind auf folgende Pins geführt:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Pin!!Bedeutung&lt;br /&gt;
|- &lt;br /&gt;
|P99||Syncsignal DDS 0&lt;br /&gt;
|- &lt;br /&gt;
|P98||Syncsignal DDS 1&lt;br /&gt;
|- &lt;br /&gt;
|P113||Syncsignal DDS 2&lt;br /&gt;
|- &lt;br /&gt;
|P112||Syncsignal DDS 3&lt;br /&gt;
|- &lt;br /&gt;
|P97||Pulsgenerator&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
=== SPI-Schnittstelle ===&lt;br /&gt;
&lt;br /&gt;
Über den [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI]-Slave kann ein Master (z.B. ein Mikrocontroller wie der ATmega644 auf der [http://www.mikrocontroller.net/topic/122573 Karte aus dem c´t-Lab]) Konfigurationswerte ans &#039;&#039;&#039;FPGA Lab&#039;&#039;&#039; übergeben und Messwerte auslesen. Dazu besitzt der SPI-Slave mehrere Datenregister mit 32 Bit Breite, die über ein separates Adressregister ausgewählt werden können.&lt;br /&gt;
&lt;br /&gt;
Der SPI-Slave hat folgende Signale:&lt;br /&gt;
* MOSI (&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;O&#039;&#039;&#039;ut -&amp;gt; &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;I&#039;&#039;&#039;n): zu schreibende Daten zum &#039;&#039;&#039;FPGA Lab&#039;&#039;&#039;&lt;br /&gt;
* MISO (&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;I&#039;&#039;&#039;n &amp;lt;- &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;O&#039;&#039;&#039;ut): gelesene Daten vom &#039;&#039;&#039;FPGA Lab&#039;&#039;&#039;&lt;br /&gt;
* SCLK (&#039;&#039;&#039;S&#039;&#039;&#039;hift &#039;&#039;&#039;Cl&#039;&#039;&#039;oc&#039;&#039;&#039;k&#039;&#039;&#039;): Schiebetakt&lt;br /&gt;
* SS_Address (&#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;S&#039;&#039;&#039;elect for address): Auswahl des Adressenregisters &lt;br /&gt;
* SS_Data (&#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;S&#039;&#039;&#039;elect for data): Auswahl des aktuell adressierten Datenregisters&lt;br /&gt;
&lt;br /&gt;
Die beiden SS-Signale sowie SCLK sind im Ruhezustand High, zum Übertragen einer Adresse oder eines Datenwortes zieht der Master (also z.B. der Mikrocontroller) das entsprechende SS-Signal und danach auch SCLK auf Low. Der Master legt ein Datenbit an MOSI an und erzeugt an SCLK eine steigende Flanke. Diese veranlasst den Slave, das Datenbit in sein internes Empfangsschieberegister einzulesen. Das wiederholt sich für die folgenden Bits, wobei die höherwertigen Bits immer zuerst übertragen werden. Sofern gerade ein Datenwort (und keine Adresse) übertragen wird, stellt der Slave gleichzeitig an jeder fallenden SCLK-Flanke (inklusive der ersten) jeweils ein Bit aus seinem Sendesschieberegister an MISO zur Verfügung, das der Master dann an der nächsten steigenden SCLK-Flanke übernehmen kann. Am Ende der Übertragung setzt der Master das SS-Signal wieder auf High.&lt;br /&gt;
&lt;br /&gt;
Bei aktiviertem (also auf Low gezogenem) SS_Address wird das Adressregister angesprochen, bei aktiviertem SS_Data dasjenige Datenregister, das durch das Adressregister angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Die Adressen sind wie folgt belegt:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Adresse!!rowspan=&amp;quot;2&amp;quot;|Richtung!!rowspan=&amp;quot;2&amp;quot;|Komponente!!colspan=&amp;quot;2&amp;quot;|Bedeutung der Bits!!rowspan=&amp;quot;2&amp;quot;|Anmerkungen&lt;br /&gt;
|- &lt;br /&gt;
|31..16||15..0&lt;br /&gt;
|- &lt;br /&gt;
|3||W||Quelle für Analogausgänge||colspan=&amp;quot;2&amp;quot;|Ausgänge 0 und 1||Bit 7..4: Ausgang 1, Bit 3..0: Ausgang 0 (jeweils Wert 0..3: entsprechender DDS-Kanal, 4: Pulsgenerator)&lt;br /&gt;
|- &lt;br /&gt;
|4||R||rowspan=&amp;quot;3&amp;quot;|Universalzähler||colspan=&amp;quot;2&amp;quot;|Status||Bit 1: Überlauf, Bit 0: Signal aktiv &lt;br /&gt;
|- &lt;br /&gt;
|5||R||colspan=&amp;quot;2&amp;quot;|Rohmesswert||muss entsprechend Torzeit bzw. Messfrequenz umgerechnet werden&lt;br /&gt;
|- &lt;br /&gt;
|12||W||colspan=&amp;quot;2&amp;quot;|Konfiguration||Bit 10..8: Signalquelle (Wert 0..3: entsprechender DDS-Kanal, 4: Pulsgenerator, 5: externes Signal), Bit 4: Messart (Wert 0: Frequenz, 1: Periode), Bit 3..0: Vorteilermodus (s.u.)&lt;br /&gt;
|- &lt;br /&gt;
|14||W||rowspan=&amp;quot;2&amp;quot;|Pulsgenerator||colspan=&amp;quot;2&amp;quot;|Pausendauer||Auflösung 10&amp;amp;nbsp;ns&lt;br /&gt;
|- &lt;br /&gt;
|15||W||colspan=&amp;quot;2&amp;quot;|Pulsdauer||Auflösung 10&amp;amp;nbsp;ns&lt;br /&gt;
|- &lt;br /&gt;
|16||W||rowspan=&amp;quot;3&amp;quot;|DDS-Kanal 0||colspan=&amp;quot;2&amp;quot;|Wellenform &amp;amp; Modulationsquelle||siehe separate Tabelle unten&lt;br /&gt;
|- &lt;br /&gt;
|17||W||colspan=&amp;quot;2&amp;quot;|Phaseninkrement||bestimmt direkt die Frequenz, Auflösung 0,023&amp;amp;nbsp;Hz&lt;br /&gt;
|- &lt;br /&gt;
|18||W||Amplitude||Phasenlage||Vorzeichenbehaftete Werte&lt;br /&gt;
|- &lt;br /&gt;
|20||W||rowspan=&amp;quot;3&amp;quot;|DDS-Kanal 1||colspan=&amp;quot;2&amp;quot;|Wellenform &amp;amp; Modulationsquelle||rowspan=&amp;quot;9&amp;quot;|siehe Anmerkungen zu DDS-Kanal 0&lt;br /&gt;
|- &lt;br /&gt;
|21||W||colspan=&amp;quot;2&amp;quot;|Phaseninkrement&lt;br /&gt;
|- &lt;br /&gt;
|22||W||Amplitude||Phasenlage&lt;br /&gt;
|- &lt;br /&gt;
|24||W||rowspan=&amp;quot;3&amp;quot;|DDS-Kanal 2||colspan=&amp;quot;2&amp;quot;|Wellenform &amp;amp; Modulationsquelle&lt;br /&gt;
|- &lt;br /&gt;
|25||W||colspan=&amp;quot;2&amp;quot;|Phaseninkrement&lt;br /&gt;
|- &lt;br /&gt;
|26||W||Amplitude||Phasenlage&lt;br /&gt;
|- &lt;br /&gt;
|28||W||rowspan=&amp;quot;3&amp;quot;|DDS-Kanal 3||colspan=&amp;quot;2&amp;quot;|Wellenform &amp;amp; Modulationsquelle&lt;br /&gt;
|- &lt;br /&gt;
|29||W||colspan=&amp;quot;2&amp;quot;|Phaseninkrement&lt;br /&gt;
|- &lt;br /&gt;
|30||W||Amplitude||Phasenlage&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wellenform &amp;amp; Modulationsquelle: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bits!!Bedeutung!!Anmerkungen&lt;br /&gt;
|- &lt;br /&gt;
|18..16||Wellenform||&lt;br /&gt;
|- &lt;br /&gt;
|12..8||maximale Modulationstiefe für FM||&lt;br /&gt;
|- &lt;br /&gt;
|7..6||Synchronisationsquelle||Synchronisation unabhängig von der eingestellten Phasenlage der Quelle&lt;br /&gt;
|- &lt;br /&gt;
|5..4||PM-Quelle||&lt;br /&gt;
|- &lt;br /&gt;
|3..2||FM-Quelle||&lt;br /&gt;
|- &lt;br /&gt;
|1..0||AM-Quelle||&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der interne Vorteiler des Universalzählers erzeugt aus dem Systemtakt folgendes Signal: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Modus!!Frequenz (Periode)!!vorgesehene Verwendung&lt;br /&gt;
|- &lt;br /&gt;
|0||1&amp;amp;nbsp;Hz (1&amp;amp;nbsp;s)||rowspan=&amp;quot;3&amp;quot;|Torsignal für Frequenzmessung&lt;br /&gt;
|- &lt;br /&gt;
|1||0,1&amp;amp;nbsp;Hz (10&amp;amp;nbsp;s)&lt;br /&gt;
|- &lt;br /&gt;
|2||10&amp;amp;nbsp;Hz (0,1&amp;amp;nbsp;s)&lt;br /&gt;
|- &lt;br /&gt;
|4||10&amp;amp;nbsp;MHz||rowspan=&amp;quot;4&amp;quot;|Zählsignal für Periodenmessung&lt;br /&gt;
|- &lt;br /&gt;
|5||1&amp;amp;nbsp;MHz&lt;br /&gt;
|- &lt;br /&gt;
|6||100&amp;amp;nbsp;kHz&lt;br /&gt;
|- &lt;br /&gt;
|7||10&amp;amp;nbsp;kHz&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
== Bedienung ==&lt;br /&gt;
&lt;br /&gt;
=== LabVIEW-Bedienoberfläche ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;&lt;br /&gt;
[[Datei:Screenshot LabView-Frontend.png|thumb|400px|LabVIEW-Bedienoberfläche]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit existiert eine mit [http://www.ni.com/labview/ LabVIEW] 8 entwickelte Bedienoberfläche. Sie kommuniziert mit dem &#039;&#039;&#039;FPGA Lab&#039;&#039;&#039; über das textbasierte c´t-Lab-Protokoll (was aber leicht änderbar ist). Ihre einzelnen Bereiche sind nachstehend erklärt.&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle ====&lt;br /&gt;
&lt;br /&gt;
Hier können die Schnittstelle und der Kanal des c´t-Lab-Busses, über welche die FPGA-Karte angeschlossen ist, eingestellt werden. Weiters kann das Abfrageintervall für die Messwerte festgelegt werden. Zusätzlich zu diesen intervallgesteuerten Abfragen werden die Messwerte aber auch unmittelbar ausgelesen, wenn Einstellungen geändert und somit ans &#039;&#039;&#039;FPGA Lab&#039;&#039;&#039; gesendet werden. Außerdem können hier alle Einstellungen zurückgesetzt werden, die entsprechenden Einstellungen werden dabei ans &#039;&#039;&#039;FPGA Lab&#039;&#039;&#039; gesendet. Nach dem Rücksetzen erzeugen die vier DDS-Kanäle jeweils ein unmoduliertes Sinussignal mit 1&amp;amp;nbsp;kHz bei voller Amplitude und 0°&amp;amp;nbsp;Phasenlage, der Pulsgenerator erzeugt dann ein symmetrisches Pulssignal mit ebenfalls 1&amp;amp;nbsp;kHz.&lt;br /&gt;
&lt;br /&gt;
==== Universalzähler ====&lt;br /&gt;
&lt;br /&gt;
Für den Universalzähler kann eines der internen Signale oder ein externes ausgewählt werden. Außerdem kann die Torzeit oder die Messfrequenz eingestellt werden, wobei gleichzeitg zwischen den beiden Messarten Frequenz- und Periodenmessung umgeschaltet wird. Der jeweils andere Wert wird errechnet und ebenfalls angezeigt. Ein Indikator zeigt durch mehr oder weniger regelmäßiges Blinken ein anliegendes Signal und somit laufende Messaktivitäten an, ein zweiter Indikator weist auf einen Überlauf des Messbereiches hin (was aber nur bei sehr langen Periodenmessungen vorkommen kann). &lt;br /&gt;
&lt;br /&gt;
==== Analogausgänge ====&lt;br /&gt;
&lt;br /&gt;
Für jeden der beiden Analogausgänge kann eingestellt werden, welches der internen Generatorsignale dort erscheinen soll. Zur Wahl stehen die vier DDS-Kanäle und der Pulsgenerator. Die nicht ausgewählten DDS-Kanäle können natürlich weiterhin zur Modulation anderer Kanäle verwendet werden. Außerdem sind zusätzlich zu den beiden Analogausgängen immer auch noch die Digitalsignale (DDS-Synchronisation, Pulsgenerator) verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Pulsgenerator ====&lt;br /&gt;
&lt;br /&gt;
Hier können die Puls- und Pausenlängen in mehreren Bereichen eingestellt werden. Die sich daraus ergebende Frequenz wird angezeigt.&lt;br /&gt;
&lt;br /&gt;
==== DDS-Generator ====&lt;br /&gt;
&lt;br /&gt;
Die Bedienelemente für die vier Kanäle des DDS-Generators sind hier auf zwei Registerkarten untergebracht. Es kann die Wellenform ausgewählt und die Frequenz eingestellt werden. Das exakte Phaseninkrement, also der Wert, um den sich der Phasenakkumulator im Systemtakt (100&amp;amp;nbsp;MHz) erhöht, wird hexadezimal angezeigt.&lt;br /&gt;
&lt;br /&gt;
Die Amplitude kann vom invertierenden Maximum bis zum nichtinvertierenden Maximum eingestellt werden. Damit lässt sich z.B. ein fallendes oder steigendes Sägezahnsignal erzeugen. Die Phasenlage kann um jeweils eine Periode in beide Richtungen verschoben werden. Als Quellen für die Modulationsarten AM, FM und PM können die jeweils anderen drei DDS-Kanäle in beliebiger Kombination ausgewählt werden. Für FM kann die maximale Modulationstiefe in mehreren Stufen ausgewählt werden (die &#039;krummen&#039; Endwerte ergeben sich durch die wiedeholte Teilung von &amp;amp;plusmn;25&amp;amp;nbsp;MHz durch&amp;amp;nbsp;8). Bei AM und FM wird eine eventuelle Übermodulation angezeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hinweise zur Realisierung ==&lt;br /&gt;
&lt;br /&gt;
=== Komponenten ===&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;FPGA Lab&#039;&#039;&#039; enthält einen [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI]-Slave mit mehreren adressierbaren Registern, der auch als eigenständige Komponente in anderen Projekten eingesetzt werden kann. &lt;br /&gt;
&lt;br /&gt;
=== Plattform, Portabilität ===&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;FPGA Lab&#039;&#039;&#039; wurde unter Verwendung von [http://www.mikrocontroller.net/articles/Xilinx_ISE Xilinx ISE] 11.1 entwickelt. Im FPGA-Code wurde auf Portabilität geachtet. Alle Bestandteile sind in VHDL implementiert, Schematics werden nicht verwendet. Xilinx-Spezifika wurden fast vollständig vermieden, die interne Taktverdoppelung per DCM ist gekapselt. Der Code sollte sich also relativ leicht auf andere FPGA-Karten und auch auf andere FPGAs übertragen lassen. Durch die Verwendung von Generics im VHDL-Code sind viele Aspekte relativ leicht änderbar (z.B. Wert- und Zeitauflösung der DDS-Generatoren, Größe der DDS-Lookup-Tabellen, Anzahl der Adressen des SPI-Slaves,...). Für nahezu alle Entitäten existieren selbstverifizierende Tests und Konfigurationsdateien für die Kurvenformanzeige im Simulator ISim.  &lt;br /&gt;
&lt;br /&gt;
Der auf der FPGA-Karte befindliche Mikrocontroller (ATmega644) vermittelt zwischen dem auf dem FPGA realisierten [http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface SPI]-Slave einerseits und dem über RS232, USB oder Ethernet angeschlossenen PC andererseits. Die Anbindung des PC erfolgt galvanisch getrennt über den [http://thoralt.ehecht.com/wiki/index.php?title=Optobus Optobus] des c´t-Lab. Für den Mikrocontroller wird (derzeit) die Originalfirmware (Version 2.6) benutzt, sie ist nicht Bestandteil dieses Projektes. Zwischen Mikrocontroller und PC wird ein einfaches textbasiertes Protokoll benutzt, um bestimmte SPI-Register zu beschreiben oder auszulesen. Die Bedienoberfläche nutzt dieses Protokoll. Da dort diese Kommunikation in einem SubVI gekapselt ist, sollte sie sich leicht an andere Anbindungen anpassen lassen.&lt;br /&gt;
&lt;br /&gt;
Die Bedienoberfläche wurde mit der Studentenversion von [http://www.ni.com/labview/ LabVIEW] 8.6 des Herstellers [http://www.ni.com/ National Instruments] entwickelt. Diese Version kostet wenig und liegt auch einigen Büchern über LabVIEW bei. Da die Kommunikation zwischen PC und dem Mikrocontroller der FPGA-Karte textbasiert ist, lassen sich aber auch Bedienoberflächen in anderen Technologien relativ leicht erstellen. Grunsätzlich reicht bereits ein Terminalprogramm aus, um das &#039;&#039;&#039;FPGA Lab&#039;&#039;&#039; anzusteuern.&lt;br /&gt;
&lt;br /&gt;
Die Klassenbibliothek [[Ct Lab Client Library]] kann aus allen .NET-fähigen Programmierumgebungen genutzt werden. Sie benötigt die Laufzeitumgebung des Microsoft .NET Framework 3.5.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Was noch fehlt ===&lt;br /&gt;
&lt;br /&gt;
* einstellbarer DC-Anteil bei den DDS-Generatoren&lt;br /&gt;
* gemeinsame Nutzung der Wellenformtabellen für die vier DDS-Generatoren&lt;br /&gt;
* native Windowsanwendung als Alternative zur LabVIEW-Bedienoberfläche&lt;br /&gt;
* Erweiterung zum Arbiträr- bzw. Bitmustergenerator.&lt;br /&gt;
&lt;br /&gt;
== Quellcode, Lizenz ==&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;FPGA Lab&#039;&#039;&#039; ist quelloffen (Open Source) und wird unter der [http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL)] lizensiert. Der Quellcode steht im [http://www.mikrocontroller.net/svnbrowser/fpgalab/ SVN-Repository] zur Verfügung. Auf dieses Repository kann auch mit einem SVN-Client unter svn://mikrocontroller.net/fpgalab zugegriffen werden. Einige Sub-VIs in der Lab-View-Bedienoberfläche wurden aus dem Originalprojekt der c´t übernommen, diese sind aber ebenfalls quelloffen und dürfen sogar kommerziell genutzt werden. &lt;br /&gt;
&lt;br /&gt;
== Weitere Informationen ==&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;FPGA Lab&#039;&#039;&#039; basiert auf dem c´t-Lab von Carsten Meyer, c&#039;t magazin. Weitere Informationen gibt es hier:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/122573 XILINX FPGA Spartan CT-Projekt]&lt;br /&gt;
* [http://www.heise.de/ct/projekte/machmit/ctlab Projekteseite der c´t]&lt;br /&gt;
* [http://www.thoralt.de/phpbb/ Thoralts c&#039;t-Lab-Forum]&lt;br /&gt;
* [http://www.thoralt.de/wiki/ Thoralts c&#039;t-Lab-Wiki]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Direct_Digital_Synthesis DDS auf Wikipedia]&lt;br /&gt;
&lt;br /&gt;
Viele interessante Informationen zu VHDL und FPGAs habe ich der [http://www.lothar-miller.de/s9y/ Website von Lothar Miller] entnommen. Herzlichen Dank!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;/div&gt;</summary>
		<author><name>92.227.199.61</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Ct_Lab_Client_Library&amp;diff=93770</id>
		<title>Ct Lab Client Library</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Ct_Lab_Client_Library&amp;diff=93770"/>
		<updated>2016-08-25T21:50:20Z</updated>

		<summary type="html">&lt;p&gt;92.227.199.61: URLs fixed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die &#039;&#039;&#039;Ct Lab Client Library&#039;&#039;&#039; ist eine Klassenbibliothek für das [http://www.heise.de/ct/projekte/machmit/ctlab c´t-Lab] der Zeitschrift [http://www.heise.de c´t] im Allgemeinen und für das darauf basierende [[FPGA Lab]] im Speziellen. Damit können unter Windows Anwendungen erstellt werden, welche das c´t-Lab oder das FPGA Lab steuern können. Falls andere c´t-Lab-Geräte (d.h. Module wie z.B. DCG, DDS oder DIV) oder andere Anwendungen auf dem FPGA-Modul gesteuert werden sollen, sind Anpassungen vorzunehmen, die Komponente für das FPGA Lab kann dabei als Beispiel genutzt werden. Die &#039;&#039;&#039;Ct Lab Client Library&#039;&#039;&#039; kann aus allen .NET-fähigen Programmierumgebungen genutzt werden. Sie benötigt die Laufzeitumgebung des Microsoft .NET Framework 3.5.&lt;br /&gt;
&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
&lt;br /&gt;
Zu Beginn sollen hier einige Codeauszüge gezeigt werden, um die Verwendung der Bibliothek zu demonstrieren. &lt;br /&gt;
&lt;br /&gt;
=== Anwendungen auf Geräteebene mit dem FPGA Lab ===&lt;br /&gt;
&lt;br /&gt;
Diese Beispiele beziehen sich zwar auf das [[FPGA Lab]], es lassen sich aber mit wenig Aufwand ähnliche Programmierschnittstellen für andere c´t-Lab-Geräte (Module) schaffen. Die Basisfunktionalität ist vorhanden, die Implementierung für das FPGA Lab kann als Beispiel für eigene Erweiterungen dienen.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel erzeugt ein amplitudenmoduliertes Signal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Configure DDS channel 0 (carrier, modulated by DDS channel 1).&lt;br /&gt;
fpgaLab.DdsGenerators[0].Waveform = Waveforms.Sine;&lt;br /&gt;
fpgaLab.DdsGenerators[0].Frequency = 1000;&lt;br /&gt;
fpgaLab.DdsGenerators[0].Amplitude = (short)(fpgaLab.DdsGenerators[0].MaximumAmplitude * 1 / 2);&lt;br /&gt;
fpgaLab.DdsGenerators[0].AmplitudeModulationSource = ModulationAndSynchronizationSources.DdsGenerator1;&lt;br /&gt;
&lt;br /&gt;
// Configure DDS channel 1 (modulator).&lt;br /&gt;
fpgaLab.DdsGenerators[1].Waveform = Waveforms.Sine;&lt;br /&gt;
fpgaLab.DdsGenerators[1].Frequency = 100;&lt;br /&gt;
fpgaLab.DdsGenerators[1].Amplitude = (short)(fpgaLab.DdsGenerators[1].MaximumAmplitude * 1 / 4);&lt;br /&gt;
&lt;br /&gt;
// Flush all modifications, i.e. send all set commands that have modified values.&lt;br /&gt;
appliance.SendSetCommandsForModifiedValues();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Und so lässt sich der Universalzähler auf eine Frequenzmessung mit 100&amp;amp;nbsp;ms Torzeit einstellen. Die Abfragekommandos für die Messwerte werden regelmäßig gesendet, bei einer Änderung des Messwertes wird das Ereignis ValueChanged ausgelöst.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Configure the universal counter.&lt;br /&gt;
fpgaLab.UniversalCounter.PrescalerMode = PrescalerModes.GatePeriod_100ms;&lt;br /&gt;
&lt;br /&gt;
// Flush all modifications, i.e. send all set commands that have modified values.&lt;br /&gt;
appliance.SendSetCommandsForModifiedValues();&lt;br /&gt;
&lt;br /&gt;
// Listen to counter changes and display them.&lt;br /&gt;
fpgaLab.UniversalCounter.ValueChanged +=&lt;br /&gt;
    (sender, e) =&amp;gt; Console.WriteLine(&amp;quot;Counter reported a new frequency: {0}&amp;quot;, e.Value);&lt;br /&gt;
&lt;br /&gt;
// Send the cached query commands periodically.&lt;br /&gt;
appliance.StartSendingQueryCommands(_queryCommandSendPeriod);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Anwendungen auf der Ebene der Kommandos und Nachrichten ===&lt;br /&gt;
&lt;br /&gt;
So lässt sich ein Kommando direkt erstellen und absenden. Diese Zeilen senden den Wert 128 an den Subkanal 1.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Send a command.&lt;br /&gt;
var setCommand = new SetCommand(_channel, 1);&lt;br /&gt;
setCommandCache.Add(setCommand);&lt;br /&gt;
setCommand.SetValue(128);&lt;br /&gt;
setCommandCache.SendCommandsForModifiedValues();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und so kann man per Ereignisbehandlung empfangene Nachrichten verarbeiten. Hier wird auf Nachrichten von Subkanal 255 reagiert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Prepare to receive messages.&lt;br /&gt;
var messageContainer = messageCache.Register(_channel, 255);&lt;br /&gt;
messageContainer.MessageUpdated +=&lt;br /&gt;
    (sender, e) =&amp;gt; Console.WriteLine(&amp;quot;Message received, channel {0}/{1}, raw value {2}&amp;quot;,&lt;br /&gt;
                                     messageContainer.Message.Channel,&lt;br /&gt;
                                     messageContainer.Message.Subchannel,&lt;br /&gt;
                                     messageContainer.Message.RawValue);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Logische Struktur ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;&lt;br /&gt;
[[Datei:Ct_Lab_Client_Library_Overview.png|thumb|400px|Struktur der Bibliothek]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;Ct Lab Client Library&#039;&#039;&#039; ist in mehrere Ebenen gegliedert, die über Schnittstellen miteinander verbunden sind. Implementierungen lassen sich mit geringen Änderungen austauschen, auch zur Laufzeit. Diese Ebenen spiegeln sich in den Komponenten und Namensräumen der Bibliothek wider.&lt;br /&gt;
&lt;br /&gt;
=== Verbindungen ===&lt;br /&gt;
&lt;br /&gt;
Auf der Verbindungsebene wird das Versenden und Empfangen von Zeichenketten über die jeweils genutzte Schnittstelle gesteuert. Diese Zeichenketten entsprechen auf den höheren Ebenen Befehlen und Nachrichten. Die darüberliegenden Ebenen arbeiten mit dieser Verbindungsebene, ohne sich um die konkrete physikalische Ausprägung (z.B. seriell, USB, LAN) kümmern zu müssen.&lt;br /&gt;
&lt;br /&gt;
Es wird eine Implementierung für (physikalische oder emulierte) serielle Ports sowie eine für eine simulierte Verbindung mitgeliefert. Letztere ist für Tests ohne c´t-Hardware nützlich, sie kann gesendete Zeichenketten protokollieren sowie den Empfang von Zeichenketten simulieren.&lt;br /&gt;
&lt;br /&gt;
=== Kommandos und Nachrichten ===&lt;br /&gt;
&lt;br /&gt;
Auf dieser Ebene werden die Zeichenketten der Verbindungsebene gekapselt und als gesendete Kommandos beziehungsweise empfangene Nachrichten abstrahiert. Das Assemblieren der zu sendenden Zeichenketten und das Parsen der empfangenen Zeichenketten findet hier statt. Ein Cache verhindert das unnötige Mehrfachabsenden von Kommandos. Es kann außerdem ein Scheduler genutzt werden, welcher vorher registrierte Kommandos (z.B. zur Messwertabfrage) regelmäßig abschickt. Eintreffende Nachrichten lösen Ereignisse aus, die abonniert werden können.&lt;br /&gt;
&lt;br /&gt;
Diese Ebene ist generisch realisiert und muss in der Regel nicht angepasst werden. Diese Standardimplementierung wird natürlich mitgeliefert.&lt;br /&gt;
&lt;br /&gt;
=== Geräte ===&lt;br /&gt;
&lt;br /&gt;
Auf dieser Ebene werden wiederum die Befehle und Nachrichten gekapselt und als Gerätemanipulationen beziehungsweise Wertänderungen abgebildet. Gerätemanipulationen, z.B. das Verändern von Einstellungen, werden hier auf die entsprechenden Kommandos umgesetzt, empfangene Nachrichten auf Änderungen der zugeordneten Werte. Solche Wertänderungen lösen dann auf dieser Ebene wiederum Ereignisse aus, die abonniert werden können.&lt;br /&gt;
&lt;br /&gt;
Diese Ebene bildet die einzelnen vorhandenen Geräte (d.h. die c´t-Lab-Module) ab. Die Basisimplementierung wird mitgeliefert, ebenso eine konkrete Implementierung für ein als [[FPGA Lab]] konfiguriertes FPGA-Modul. Mit letzterer kann man die auf dem FPGA Lab vorhandenen DDS- und Pulsgeneratoren sowie den Universalzähler intuitiv steuern.&lt;br /&gt;
&lt;br /&gt;
=== Umgebung ===&lt;br /&gt;
&lt;br /&gt;
Diese Ebene repräsentiert die als Hardware vorhandene Arbeitsumgebung, d.h. die konkrete Bestückung des c´t-Lab mit Geräten (Modulen). Hier werden die verwendeten c´t-Lab-Module und deren Zuordnung zu den verfügbaren Kanälen berücksichtigt. Diese Ebene stellt auch den zentralen Einstiegspunkt der Bibliothek zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
== Technische Realisierung ==&lt;br /&gt;
&lt;br /&gt;
Die Klassenbibliothek wurde in C# und basierend auf dem Microsoft .NET Framework 3.5 entwickelt und kann daher aus allen .NET-fähigen Programmierumgebungen genutzt werden. Es werden einige Fremdkomponenten eingebunden und gängige Designprinzipien angewendet. Diese werden hier kurz erwähnt, mehr würde den Rahmen sprengen. Wer die Bibliothek ohnehin nur anwenden will, muss sich um diese Details auch nicht kümmern.&lt;br /&gt;
&lt;br /&gt;
=== Dependency Injection mit StructureMap ===&lt;br /&gt;
&lt;br /&gt;
Zur besseren Modularisierung wird [http://de.wikipedia.org/wiki/Dependency_Injection Dependency Injection] angewendet und dafür der Dependency-Injection-Container [http://structuremap.net StructureMap] eingesetzt. Auf diese Weise werden die einzelnen Ebenen streng getrennt und nur über Schnittstellen verbunden. Die konkrete Implementierung einer Schnittstelle wird sehr spät festgelegt und kann auch mit wenig Aufwand geändert werden. Das hat nicht zuletzt Vorteile bei den automatisierten Tests und wird dort intensiv genutzt.&lt;br /&gt;
&lt;br /&gt;
=== Automatisierte Unit-Tests mit xUnit.net und Rhino Mocks ===&lt;br /&gt;
&lt;br /&gt;
Die gesamte Entwicklung erfolgte [http://de.wikipedia.org/wiki/Testgetriebene_Entwicklung testgetrieben] unter intensivem Einsatz automatisierter [http://de.wikipedia.org/wiki/Unit-Test Unit-Tests] nach den Prinzipien des [http://en.wikipedia.org/wiki/Test-driven_development Test-Driven Development (TDD)] beziehungsweise des [http://en.wikipedia.org/wiki/Behavior_Driven_Development Behaviour-Driven Development (BDD)]. Für die Unit-Tests wurde [http://xunit.codeplex.com xUnit.net] eingesetzt, für die Erstellung der dafür nötigen simulierten Objekte ([http://de.wikipedia.org/wiki/Mock-Objekt Mocks]) [http://ayende.com/projects/rhino-mocks.aspx Rhino Mocks]. Mit Hilfe der [http://www.bjoernrochel.de/2008/10/04/introducing-xunitbddextensions xUnit.BDDExtensions] wurden relativ knappe, kurze Tests erstellt, die gleichzeitig als Spezifikation dienen. Wie bei BDD üblich, wurde die Namensgebung der Testklassen und -methoden so gewählt, dass sich mehr oder weniger natürlichsprachige Anforderungen ergeben, deren Einhaltung der jeweilige Test dann überprüft.&lt;br /&gt;
&lt;br /&gt;
Die gesamte Testsuite nutzt die simulierte Verbindung und kann daher ohne vorhandene c´t-Lab-Hardware durchlaufen werden. Sie enthält einerseits Tests, welche  isolierte Klassen und Ebenen testen. Andere Tests überprüfen aber auch die Integration und die korrekte Zusammenschaltung über den Dependency-Injection-Container (StructureMap).&lt;br /&gt;
 &lt;br /&gt;
== Wichtige Dateien und Verzeichnisse ==&lt;br /&gt;
&lt;br /&gt;
Alle Dateien einschließlich des Quellcodes stehen im [http://www.mikrocontroller.net/svnbrowser/fpgalab/ SVN-Repository des FPGA Lab] zur Verfügung. Auf dieses Repository kann auch mit einem SVN-Client unter svn://mikrocontroller.net/fpgalab zugegriffen werden. &lt;br /&gt;
&lt;br /&gt;
=== Ablauffähige Bibliothek ===&lt;br /&gt;
&lt;br /&gt;
Unter &amp;quot;.\Binary\Windows\Ct Lab Client Library&amp;quot; ist die &#039;&#039;&#039;Ct Lab Client Library&#039;&#039;&#039; fertig kompiliert in zwei Versionen verfügbar.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;FpgaLab.dll&#039;&#039; enthält den kompletten hier beschriebenen Funktionsumfang inklusive der für das [[FPGA Lab]] angepassten Geräte- und Umgebungsebene.&lt;br /&gt;
* &#039;&#039;CtLab.dll&#039;&#039; ist allgemeiner gehalten und beinhaltet die Teile für das [[FPGA Lab]] nicht. Diese DLL eignet sich daher gut für eigene c´t-Lab-Anwendungen.&lt;br /&gt;
&lt;br /&gt;
=== Anwendungsbeispiele ===&lt;br /&gt;
&lt;br /&gt;
Unter &amp;quot;.\Binary\Windows\Test Console&amp;quot; befindet sich der Quellcode für eine kleine Consolenanwendung, welche mehrere Beispiele enthält. Diese zeigen die Anwendung der &#039;&#039;&#039;Ct Lab Client Library&#039;&#039;&#039; für verschiedene Aufgaben. Einige dieser Beispiele funktionieren ohne vorhandene c´t-Lab-Hardware, andere setzen ein [[FPGA Lab]] voraus.&lt;br /&gt;
&lt;br /&gt;
=== Quellcode ===&lt;br /&gt;
&lt;br /&gt;
Unter &amp;quot;.\Windows\Ct Lab Client Library&amp;quot; ist der C#-Quellcode in Form einer Projektmappe für Visual Studio verfügbar. Durch das verwendete Designprinzip bedingt gibt es recht viele Projekte und daraus resultierend auch Assemblies, die sich aber mit dem kostenlosen ILMerge von Microsoft nach dem Übersetzen zu einer einzigen DLL zusammenbinden lassen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Ct Lab.sln&#039;&#039; ist die Projektmappendatei für Visual Studio 2008, es genügt die kostenlose Express-Variante.&lt;br /&gt;
* &#039;&#039;Ct Lab.xunit&#039;&#039; ist die Projektdatei für den Testrunner von xUnit.net. Sie referenziert alle Testassemblies. Natürlich können die Tests aber auch in anderen Testrunnern (z.B. in ReSharper) ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
=== Externe Komponenten und Werkzeuge ===&lt;br /&gt;
&lt;br /&gt;
Unter &amp;quot;.\Windows\Externals&amp;quot; befinden sich die eingebundenen Fremdkomponenten, die für eine erfolgreiche Übersetzung nötig sind. Die Visual-Studio-Projekte referenzieren diese Komponenten über relative Pfade genau in diesen Ordnern. Um die Testsuiten ablaufen zu lassen, ist aber noch ein installiertes xUnit.net nötig.&lt;br /&gt;
&lt;br /&gt;
=== Übersetzen des Quellcodes, Bauen der DLLs ===&lt;br /&gt;
&lt;br /&gt;
Nach dem Übersetzen können die entstandenen Assemblies sofort in eigenen Anwendungen benutzt werden. Bequemer ist es allerdings, diese zuvor noch zu einer einzelnen kompakten DLL zusammenzubinden. Dazu gibt es von Microsoft das kostenlose Werkzeug ILMerge.&lt;br /&gt;
&lt;br /&gt;
Die Batchdatei &#039;&#039;Merge.bat&#039;&#039; im Ordner &amp;quot;.\Windows\Ct Lab Client Library\Build&amp;quot; kann verwendet werden, um ILMerge mit den richtigen Parametern aufzurufen. Es werden die beiden Dateien &#039;&#039;FpgaLab.dll&#039;&#039; und &#039;&#039;CtLab.dll&#039;&#039; im selben Ordner erstellt. ILMerge befindet sich allerdings nicht im Repository sondern muss separat (z.B. vom Microsoft-Webauftritt) heruntergeladen werden. Die Batchdatei erwartet ILMerge im Ordner &amp;quot;.\Windows\Externals\ILMerge&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Lizenz ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;Ct Lab Client Library&#039;&#039;&#039; ist quelloffen (Open Source) und wird unter der [http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL)] lizensiert. Die Bibliothek nutzt weitere Open-Source-Komponenten, insbesondere [http://structuremap.net StructureMap], [http://xunit.codeplex.com xUnit.net], [http://ayende.com/projects/rhino-mocks.aspx Rhino Mocks] und [http://www.bjoernrochel.de/2008/10/04/introducing-xunitbddextensions xUnit.BDDExtensions]. &lt;br /&gt;
&lt;br /&gt;
== Weitere Informationen ==&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;FPGA Lab&#039;&#039;&#039; basiert auf dem c´t-Lab. Näheres gibt es unter:&lt;br /&gt;
&lt;br /&gt;
* [[FPGA Lab]]: Ein FPGA-basiertes Signallabor&lt;br /&gt;
&lt;br /&gt;
Das c´t-Lab ist ein Projekt von Carsten Meyer, c&#039;t magazin. Weitere Informationen gibt es hier:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/122573 XILINX FPGA Spartan CT-Projekt]&lt;br /&gt;
* [http://www.heise.de/ct/projekte/machmit/ctlab Projekteseite der c´t]&lt;br /&gt;
* [http://www.thoralt.de/phpbb/ Thoralts c&#039;t-Lab-Forum]&lt;br /&gt;
* [http://www.thoralt.de/wiki/ Thoralts c&#039;t-Lab-Wiki]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;br /&gt;
[[Kategorie:DSP]]&lt;/div&gt;</summary>
		<author><name>92.227.199.61</name></author>
	</entry>
</feed>