<?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=84.163.162.33</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=84.163.162.33"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/84.163.162.33"/>
	<updated>2026-04-11T01:27:54Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66887</id>
		<title>Audio-DSP mit Spartan 3-FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66887"/>
		<updated>2012-06-14T22:11:58Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* Übersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [[Benutzer:TheMason]]&lt;br /&gt;
&lt;br /&gt;
==Ziel==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projekts ist es der Aufbau einer FPGA-basierten Plattform, mit der es möglich ist Synthesizer, Effektgeräte, Mischpulte oder gar ein Harddiskrecording-System zu realisieren.&lt;br /&gt;
&lt;br /&gt;
==Feature-Liste==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften des Audioprozessors: &lt;br /&gt;
&lt;br /&gt;
* Oszillatoren&lt;br /&gt;
* Biquads (Filter)&lt;br /&gt;
* Addierer, Schalter, Verstärker (Multiplizierer)&lt;br /&gt;
* Delays&lt;br /&gt;
* Steuerung des Audioprozessors via SPI oder RS232&lt;br /&gt;
* 4 Mono Ein- und Ausgänge&lt;br /&gt;
* GPO (General-Purpose-Outputs) zur Konfiguration der Codecs&lt;br /&gt;
&lt;br /&gt;
==Übersicht==&lt;br /&gt;
[[Bild:Overview_wo_uc.jpg|thumb|500px]]&lt;br /&gt;
Basis des Audiosystems ist das Spartan-3-Development-Board von Xilinx. An diesem Board werden zwei Audio-Codecs angeschlossen, von denen einer als Master und der andere als Slave agiert. Optional kann noch ein Mikrocontroller angeschlossen werden, welcher den FPGA per SPI steuert. Da dieses Projekt mittlerweile recht umfangreich geworden ist, kann ich hier nur einen kurzen Umriss des Systems geben. Dabei beschränke ich mich auf die grobe Funktionsweise des Audioorozessors, erläutere die Schnittstelle (welche ich als Basis für weitere Projekte bereits nutze) und gebe einen kleinen Überblick über die Hardware.&lt;br /&gt;
&lt;br /&gt;
Das System kann (sofern man zwei Audio-Codecs, von denen einer als Master, der andere als Slave arbeitet, angeschlossen und konfiguriert hat) direkt genutzt werden, da der DAP per RS232 gesteuert werden kann. Der Audioprozessor startet mit einem Stereo-Tiefpassfilter, das sich auf den ersten Codec bezieht,&lt;br /&gt;
sodass man eine erste Demo hat (selbst wenn diese etwas unspektakulär ist)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nachbau==&lt;br /&gt;
&lt;br /&gt;
Wer sich dieses System nachbauen möchte, benötigt zunächst ein FPGA-Board. Mit dem Spartan-3-Board von Digilent gestaltet sich der Nachbau einfach, weil die Programmier-Dateien für den FPGA direkt für dieses Board verwendet werden können. Nutzer anderer Boards (Xilinx) müssten zuerst die UCF-Datei für die Pins ihres jeweiligen Boards anpassen, und dieses Projekt neu synthetisieren (compilieren). Nutzer von Altera-Boards hingegen müssen die BlockRAM-Instanzen auf die Altera-Architektur anpassen (den Inhalt der RAMs dabei nicht vergessen :-). Vielleicht findet sich ja der eine oder andere der den VHDL Code für Altera-FPGAs portiert.&lt;br /&gt;
Der eigentliche wichtige Teil eines Nachbaus ist der Codec-Teil. Dieses System verwendet zwar zwei Codecs, aber es kann auch mit einem gearbeitet werden. Als Codec kommt der TLV320AIC23B von Texas Instruments zum Einsatz. Diesen kann man als kostenloses Muster bei TI direkt bekommen. &lt;br /&gt;
Des weiteren benötigt man noch eine handvoll Bauteile wie Kondensatoren, Widerstände und einen Quarz. (Ein Codec MUSS als Master laufen, sonst hat das System keine Audio-Clocks, da diese nicht vom FPGA generiert werden)&lt;br /&gt;
Die Initialisierung des Codecs wird vom PC aus gemacht. Dazu dienen die 4 GPO-Leitungen auf dem B1-Verbinder. Da der Codec nur &amp;quot;halbes&amp;quot; SPI unterstüzt (man kann nur schreiben, nicht lesen) gestaltet sich die Initialisierung recht einfach.&lt;br /&gt;
Die 4 GPO-Leitungen teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* Chip-Select Codec 2&lt;br /&gt;
* Chip-Select Codec 1&lt;br /&gt;
* SPI Data Out&lt;br /&gt;
* SPI Clock&lt;br /&gt;
&lt;br /&gt;
==Audio-Prozessor (DAP)==&lt;br /&gt;
&lt;br /&gt;
[[bild:Overview dap core.JPG|thumb|500px|right]]&lt;br /&gt;
&lt;br /&gt;
Der FPGA beinhaltet in dem gesamten System einen Quasi-DSP. Quasi-DSP deshalb, da die Struktur im Gegensatz zu einem DSP bzw. Mikrocontroller keine Verzweigungen, Interrupts oder ähnliches zulässt. Der Audio-Prozessor besteht im wesentlichen aus 3 Teilen : einem Rahmen, einem SDSP (Small DSP)-Kern &lt;br /&gt;
sowie einem Utility-Kern. Beide Kerne können theoretisch parallel arbeiten, da jeder Kern einen eigenen Zustandsautomaten und einen eigenen Microcode-Speicher besitzen. Diese Möglichkeit ist allerdings noch nicht implementiert.&lt;br /&gt;
&lt;br /&gt;
Der SDSP-Kern besteht im wesentlichen aus einer MAC-Einheit, einem Speicher für Audiodaten, einem Koeffizienten-Speicher, einem Adressgenerator und mehreren Muxern, sowie dem schon angesprochenen Zustandsautomaten und dem Microcode. Weiterhin ist ein Hidden-Write- (bzw. Shadow Register) Mechanismus integriert,&lt;br /&gt;
welcher ein &amp;quot;knackserfreies&amp;quot; Aktualisieren von Koeffizienten ermöglicht. Alle diese Komponenten werden vom Microcode aus gesteuert (genau wie bei einem Mikrocontroller). Mit diesem Kern ist es möglich, Audiosignale zu bearbeiten. Zu Den Bearbeitungsmöglichkeiten zählen in erster Linie das Verändern der Lautstärke, Mischen, Filtern (Biquad) sowie Laden und Speichern von &lt;br /&gt;
Audiowerten.&lt;br /&gt;
&lt;br /&gt;
Der Utility-Kern besteht aus einem Akkumulator (für DDS), einem Shaper, einem Adressgenerator, einem Wavetable-Speicher, einem Zufallszahlengenerator, einigen Muxern, (einem Adressgenerator für SRAM, einem SRAM-Controller; diese sind allerdings nur nutzbar, wenn man das ganze mit dem ISE 6.2 synthetisiert) &lt;br /&gt;
und dem schon angesprochenen Zustandsautomaten und dem Microcode. Der Microcode steuert (genau wie beim SDSP-Kern) dabei die einzelnen Komponenten des Utility-Kerns. Dieser Kern ist für das Erzeugen von Audiosignalen zuständig, und erlaubt ein Audiosignal zu verzögern, sofern man die ISE-Version 6.2 verwendet (später dazu mehr). Als Wellenformen stehen Sägezahn, Rechteck (mit veränderbarer Pulsbreite), Rauschen sowie benutzderdefinierbare Wellenformen (Wavetable) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Der Rahmen besteht aus einem Zustandsautomaten, einem Programmspeicher, einigen Muxern, sowie einem doppelten I2S-Sender/Empfänger (für 2 Stereo Ein- und Ausgänge). In den Rahmen werden die beiden Kerne &amp;quot;eingehängt&amp;quot;. Die Kerne werden vom Programmspeicher aus mit Daten versorgt, und vom Zustandsautomaten angesteuert. Der Programmspeicher (PMEM) ist als 512x32 Bit organisiert. Das heißt, dass ein Befehl im Programmspeicher 32 Bit an Informationen enthält und der Audioprozessor max. 512 Befehle umfassen kann.&lt;br /&gt;
&lt;br /&gt;
===SDSP-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:SDSP-Struct.jpg|thumb|300px|left|Struktur des SDSP-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Der eigentliche Kern des DAPs ist die MAC-Einheit. Mit ihr werden die grundlegenden Operationen Multiplikation und Addition durchgeführt. Es ist eine 32x32-Bit-Einheit. &lt;br /&gt;
Die Funktionsweise des Kerns ist eigentlich recht einfach. &lt;br /&gt;
Die MAC-Einheit hat 2 Eingänge. Einer dieser Eingänge kann ein Audiosignal, ein Wert aus dem Audiospeicher (AMEM-BlockRAM) oder ein zuvor berechnetes Ergebnis sein. Der andere Eingang kann ein Koeffizient aus dem CMEM-BlockRAM oder eine Konstante (1.000, 0.000 oder -1.000) sein.&lt;br /&gt;
Der Ausgang (32-Bit, hart geclippt) geht auf das AMEM-BlockRAM und zum Ausgangs-Clipping. Das Ausgangsclipping schneidet das Audiosignal auf 24-Bit zurecht.&lt;br /&gt;
Die Adressen für die Speicher (AMEM und CMEM) werden im Addressgenerator erzeugt. Dieser wird von außen mit einer 8-Bit-Basis-Adresse gespeist und erzeugt einen Offset zu den Eingangsadressen. Er besitzt 2 setzbare Zähler und einige Multiplexer.&lt;br /&gt;
Alle Steuersignale der Komponenten von einem weiteren aus BlockRAM (MMEM) versorgt. Weiterhin wird von außen eine Startadresse vorgegeben. Dadurch lassen sich quasi Opcodes mit von außen vorgegeben Parametern (Adressen) aufrufen.&lt;br /&gt;
Das MMEM-BlockRAM wird nun einfach nur linear ausgelesen bis ein Stopbit gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Util-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Util-Core.jpg|thumb|300px|left|Struktur des Utility-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Beschreibung folgt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opcodes des DAP===&lt;br /&gt;
&lt;br /&gt;
Diese 32 Bit eines Befehls teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* 4 Bit = Opcode (für SDSP und Utility Kern gleich)&lt;br /&gt;
* 2 Bit = noch leer&lt;br /&gt;
* 1 Bit = Core Select (SDSP oder Utility)&lt;br /&gt;
* 1 Bit = Ende des Programms&lt;br /&gt;
* 4 Bit = Eingangsrouting (Kanal 1 - 4, Ergebnis SDSP-Kern, Ergebnis Utility-Kern)&lt;br /&gt;
* 4 Bit = Ausgangsrouting (SDSP-Ausgang auf Kanal 1-4, Utility-Ausgang auf Kanal 1-4)&lt;br /&gt;
* 8 Bit = Adresse 1 (bei SDSP für Audio-Memory, bei Utility-Kern für Datenspeicher)&lt;br /&gt;
* 8 Bit = Adresse 2 (bei SDSP für Koeffizientenspeicher, bei Utility-Kern unbenutzt)&lt;br /&gt;
&lt;br /&gt;
Das Eingangsrouting bestimmt, mit welchem Signal der gewählte Kern arbeiten soll. Dies können die Eingänge 1-4 aber auch ein vorher berechnetes Ergebnis des SDSP- bzw. Utility-Kerns sein. Das Ausgangsrouting bestimmt, von welchem Kern das Signal auf welchen Ausgang geroutet wird.&lt;br /&gt;
&lt;br /&gt;
Die Opcodes des DAPs sind:&lt;br /&gt;
&lt;br /&gt;
SDSP-Kern:&lt;br /&gt;
* Biquad rechnen&lt;br /&gt;
* Audiowert speichern&lt;br /&gt;
* Audiowert laden&lt;br /&gt;
* Move eines Wertes im Audiospeicher&lt;br /&gt;
* Summe rücksetzen&lt;br /&gt;
* Eingang zu Summe addieren&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe addieren&lt;br /&gt;
* Eingang zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Lautstärke &lt;br /&gt;
&lt;br /&gt;
Utility-Kern:&lt;br /&gt;
* Oszillator (DDS-Teil)&lt;br /&gt;
* Waveshaper&lt;br /&gt;
* Verzögerung&lt;br /&gt;
&lt;br /&gt;
Der Ablauf eines Audio-Programms ist folgender:&lt;br /&gt;
&lt;br /&gt;
Sobald ein neues Sample anliegt, wird die Abarbeitung des Programms von Adresse 0x0000 an im PMEM angestoßen. Es wird dabei jeweils ein Befehl geladen und Daten wie Opcode und Adressen liegen dabei an beide Kernen gleichermaßen an. Ist das Programm-Ende-Bit nicht gesetzt, so wird der jeweilige Kern (mit dem im Opcode angegeben Routing) angesteuert. Legt der betreffende Kern sein Ready-Signal auf 1, so wird der nächste Befehl abgearbeitet. Dieses Verhalten (Laden und Verteilen von Opcode-Daten sowie die Ablaufsteuerung, also das Ansteuern des Programms, Ansteuern der einzelnen Kerne, warten auf dessen Abarbeitung und das Programmende) wird vom Rahmen übernommen.&lt;br /&gt;
&lt;br /&gt;
===Speicherorganisation===&lt;br /&gt;
&lt;br /&gt;
Alle Speicher die vom DAP angesprochen werden, haben eine Wortbreite von 32 Bit, der Zugriff erfolgt aber ausschließlich über eine Breite von 8 Bit (Interface).&lt;br /&gt;
&lt;br /&gt;
DAP&lt;br /&gt;
* Programmspeicher 	(PMEM)   0x0000 - 0x07ff&lt;br /&gt;
&lt;br /&gt;
SDSP&lt;br /&gt;
* Audiospeicher   	(AMEM)   von außen nicht zugänglich&lt;br /&gt;
* Koeffizientenspeicher 	(CMEM)   0x2000 - 0x2023  (man &amp;quot;sieht&amp;quot; nur den Hidden Write -&amp;gt; später mehr dazu)&lt;br /&gt;
* Microcodespeicher      (MMEM)   0x4000 - 0x47ff&lt;br /&gt;
&lt;br /&gt;
Utility-Core&lt;br /&gt;
* Datenspeicher          (DMEM)   0x6000 - 0x67ff&lt;br /&gt;
* Wavetable-Speicher      (WMEM)   0x8000 - 0x87ff&lt;br /&gt;
* Microcodespeicher      (UMEM)   0xa000 - 0xa7ff&lt;br /&gt;
&lt;br /&gt;
===Hidden-Write===&lt;br /&gt;
Um bei Änderung der Koeffizienten Knackser zu vermeiden (die dadurch entstehen das der Koeffizient nur teilweise [durch 8-Bit-Zugriffe] geändert wird, währenddessen aber Audio trotzdem noch &amp;quot;weiterläuft&amp;quot; und mit &amp;quot;falschen&amp;quot; Zwischenwerten gerechnet wird), ist ein Mechanismus implementiert, der die zu ändernden Koeffizienten im Hintergund in den Speicher schreibt. Um diesen Mechanismus zu nutzen, müssen zuerst die Koeffizienten in interne Register&lt;br /&gt;
geschrieben werden. Die Register (es sind 8 32-Bit-Register) liegen im Speicherbereich 0x2000 bis 0x201f. Die Speicherstelle 0x2020 gibt die Startadresse innerhalb des Koeffizientenspeichers an. Diese Adresse ist nur 8 Bit breit. Die Speicherstelle 0x2021 gibt an, wieviele der 8 Register übertragen werden sollen. Die Speicherstelle 0x2022 löst den Kopiervorgang aus. Hier reicht es, ein Dummy-Byte zu schreiben. Um den Kopiervorgang zu beenden (MUSS GEMACHT WERDEN!, sonst können keine weiteren Koeffizientenupdates gemacht werden), schreibt man an Speicherstelle 0x2023 ebenfalls ein Dummy-Byte.&lt;br /&gt;
&lt;br /&gt;
===I/O Register===&lt;br /&gt;
&lt;br /&gt;
Es gibt noch einen 8-Bit breiten Adressbereich innerhalb des DAPs, mit dem der I2S-Teil stummgeschaltet werden kann. Weiterhin hat man die Möglichkeit, die Anzahl der Systemtakte pro Sample und die Anzahl der aktiven Systemtakte (also die Zeit die der Audioprozessor beschäftigt ist) zu ermitteln. Dadurch lässt sich eine Auslastungsanzeige des DAPs realisieren.&lt;br /&gt;
&lt;br /&gt;
===Interface===&lt;br /&gt;
&lt;br /&gt;
Um von außen nun ein Programm (bzw. Koeffizienten und Daten) zu laden, ist eine einfach zu handhabende und erweiterbare Schnittstelle implementiert. Die Schnittstelle kann per RS232 (fest eingestellt auf 115,2kBaud) oder per SPI (wird hardwaremäßig eingestellt) angesteuert werden. Die Schnittstelle in ihrer Gesamtheit ist schichtweise aufgebaut und beginnt mit einem Daten-Dispatcher. Dieser Daten-Dispatcher entscheidet (nachdem dieser selektiert wurde) mit dem ersten Byte, an welches angeschlossene Gerät der weitere Datenstrom geleitet wird.&lt;br /&gt;
&lt;br /&gt;
Als angeschlossene Geräte sind im aktuellen Entwurf ein Gerät namens &amp;quot;StdIO&amp;quot; und der Audioprozessor verfügbar.&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;StdIO&amp;quot;-Gerät steuert die 7-Segment-Anzeige (16-Bit-Hexadezimalanzeige oder 32-Bit-Einzelsegmentanzeige) sowie die 8 Leuchtdioden, und erlaubt es, die 3 Drucktaster sowie die 8 Schiebeschalter auszulesen.&lt;br /&gt;
&lt;br /&gt;
Der Audioprozessor besteht (schnittstellenseitig) nur aus einer Speicherzugriffsschnittstelle. Diese Schnittstelle entscheidet mit dem ersten Byte (sobald es selektiert wurde), ob in den Speicher geschrieben, von diesem gelesen, ein I/O-Schreib- oder -Lesezugriff erfolgen soll.&lt;br /&gt;
Die folgenden 2 Bytes (im Falle eines I/O-Zugriffs nur 1 Byte) bestimmen die Adresse und damit den Speicherbereich des Audioprozessors, auf den zugegriffen werden soll. Die Speicherschnittstelle besitzt einen Autoinkrementierer,&lt;br /&gt;
mit dem fortlaufende Bytes einfach hintereinander geschrieben werden können, ohne dass jedes mal wieder der FPGA, das Gerät und die neue Adresse neu geschrieben werden müssen, was den Zugriff erheblich beschleunigt.&lt;br /&gt;
&lt;br /&gt;
Ursprünglich basierte das System auf einem SPI-Interface. Dabei wurde die Chip-Select-Leitung als &amp;quot;globaler&amp;quot; Interface-Reset betrachtet, d.h. war die Leitung auf High, war der FPGA deselektiert und und alle Interface-Zustandsautomaten wurden im Reset gehalten. Erst mit dem Setzen dieser Leitung wurde der FPGA angesprochen. (erstes Byte -&amp;gt; Daten-Dispatcher, folgende Bytes gehen an das ausgewählte Gerät). Weiterhin hat SPI die Eigenschaft, dass mit jedem gesendeten Byte auch eines empfangen wurde. Der Umstand, dass RS232 weder eine Chip-Select Leitung benötigt noch eine synchrone Übertragung erzwingt, führt zu dem Umstand, dass man bei Nutzung von RS232 einige Befehle zusätzlich benötigt. Diese Befehle werden durch das Zeichen 0x1b (ESC) eingeleitet. Soll statt der &amp;quot;Spezialfunktion&amp;quot; das Byte 0x1b übertragen werden, so wird dieses einfach erneut gesendet. Soll die Chip-Select-Leitung gesetzt bzw. gelöscht werden, so wird die Sequenz 0x1b 0x00 (Selektieren) bzw.&lt;br /&gt;
0x1b 0x01 (Deselektieren) gesendet. Soll ein zuvor im Ausgangsregister gesetztes Byte gesendet werden, so muss die Sequenz 0x1b 0x02 gesendet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
0x121b auf dem 7-Segment-Display per RS232 anzeigen:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x00      (Hi-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x12      (Wert 12)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x01      (Lo-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x1b 0x1b (Wert 1b -&amp;gt; zu beachten: wenn der Wert 0x1b übertragen werden soll, muss dieser doppelt gesendet werden !!)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Beispiel, um in den Programmspeicher des Audioprozessors an Adresse 0x0010 das Langwort 0x12233445 zu schreiben:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf1      (DAP selektieren)&lt;br /&gt;
*- 0x00      (Speicher schreiben)&lt;br /&gt;
*- 0x00      &lt;br /&gt;
*- 0x10      (Adresse 0x0010 -&amp;gt; PMEM-Adresse 0x010)&lt;br /&gt;
*- 0x12	    (Adresse 0x0010 -&amp;gt; 0x12)	&lt;br /&gt;
*- 0x23	    (Adresse 0x0011 -&amp;gt; 0x23, autoincrement)&lt;br /&gt;
*- 0x34      (Adresse 0x0012 -&amp;gt; 0x34, autoincrement)&lt;br /&gt;
*- 0x45      (Adresse 0x0013 -&amp;gt; 0x45, autoincrement)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Auslesen der 8 Schalter:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x04      (Schalter auslesen)&lt;br /&gt;
*- 0x00	    (dummy byte -&amp;gt; überträgt Schalterstellung in Ausgaberegister)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man die 8 Schalterstellungen binärcodiert)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Der Datendispatcher (welcher mit dem ersten Byte nach dem Selektieren des FPGAs [0x1b 0x00] angesprochen wird) hat weiterhin einige nützliche Funktionen, die in ihrer Gesamtheit allerdings noch nicht ausführlich getestet wurden. Darunter sind Funktionen, mit denen Informationen über die an den Ports des Daten-Dispatchers angeschlossenen Geräte zu ermitteln. Diese Funktion kann dazu genutzt werden, um zu ermitten, welche Geräte im FPGA implementiert sind und an welchen Ports welche Geräte angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
Anzahl der Ports des Daten-Dispatchers liefern:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xed      (Anzahl Ports lesen)&lt;br /&gt;
*- 0x00      (dummy byte -&amp;gt; überträgt Inhalt des Ausgaberegisters)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man 0x22)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
===DAP-Modul-Schnipsel===&lt;br /&gt;
&lt;br /&gt;
Um mal &amp;quot;eben&amp;quot; mit dem DAP zu spielen, ein paar Schnipsel die sich recht leicht zu kompletten Funktionsblöcken zusammenschließen lassen.&lt;br /&gt;
Es werden hier nur die RS232-Sequenzen mit einer kurzen Erklärung aufgelistet.&lt;br /&gt;
&lt;br /&gt;
*Dual Mono Biquad&lt;br /&gt;
&lt;br /&gt;
*ESC 0x00 - FPGA selektieren&lt;br /&gt;
*0xF1     - DAP auswählen&lt;br /&gt;
*0x00 0x00 0x00 - Memory Write (Adresse 0x0000 -&amp;gt; Program Memory)&lt;br /&gt;
*0x10 0x00 0x00 0x08 - Biquad mit Kanal 1 (0) rechnen (AMEM = 0x00;CMEM = 0x08) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x10 0xf0 0x08 0x10 - Biquad mit vorherigem Ergebnis (0xf) rechnen (AMEM = 0x08; CMEM = 0x10) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x01 0x00 0x00 0x00 - Audioprogramm Ende (wichtig !!!)&lt;br /&gt;
*ESC 0x01 - DAP &amp;amp; FPGA deselektieren&lt;br /&gt;
&lt;br /&gt;
Erklärung :&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Opcodes 0x100008 deutet an, dass ein Biquad durchgerechnet werden soll. Das Eingangsregister 0 bedeutet, dass Kanal 1 des 1. Codecs verwendet wird. Das Ausgangsregister, welches nach Fertigstellung des Ergebnisses benutzt werden soll, ist 0 (-&amp;gt; Kanal 1 des 1. Codecs). Der Teil 0x00 0x08 bedeutet hierbei, dass die Biquad-Koeffizienten im CMEM ab Adresse 0x08 stehen. Die Audio-Zwischenwerte werden in den Audiospeicher AMEM ab Adresse 0x00 gelegt.&lt;br /&gt;
Der zweite Opcode (0x10f00810) rechnet ebenfalls ein Biquad durch. Nur dass hier statt Kanal 1 des Codecs das voher vom SDSP berechnete Ergebnis verwendet werden soll (Kanal 0xf, wenn man so will). Ausgangsregister ist auch hier wieder Kanal 1. Da dieser Biquad unabhängig vom ersten (d.h. mit anderen Parametern) gerechnet werden soll, sind hier logischerweise auch andere Adressen für AMEM (0x08) und CMEM (0x10) angegeben. Die CMEM-Adresse ist dabei etwas unkritischer, da es ja durchaus sein kann, dass ein Audiosignal zweimal mit den selben Biquad-Werten gerechnet werden soll, bzw. unterschiedliche Kanäle mit den selben Biquad-Werten, z.b. bei einem Stereo-Equalizer. Kritischer ist allerdings die Verwendung der AMEM-Adresse. Diese sollte für jede Operation (sofern AMEM denn verwendet wird) unterschiedlich sein, vor allem bei der Berechnung von Biquads. Dies hat den Grund, dass bei Operationen, die dieselben AMEM Adressen haben, die vorher berechneten Werte überschrieben werden. Dies ist bei Biquads gaanz böse (kann u.U. SEHR laut werden), und vom Ergebnis her nicht vorhersagbar.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
[[bild:Fpga_ext_board_schematic_no_uc.JPG|thumb|500px]]&lt;br /&gt;
&lt;br /&gt;
Wie Eingangs erwähnt, benötigt das System eine (bzw. zwei) Audio-Codecs. Im aktuellen Schaltplan wird auf einen Mikroprozessor verzichtet. Dieser diente im System primär zu Initialisierung der Codecs. Dieser Vorgang kann nun vom PC aus gesteuert werden, da in der neuen ISE-6.2-Version 4 Leitungen herausgeführt wurden, welche per RS232 gesetzt und gelöscht werden. &lt;br /&gt;
Wer das System nachbauen möchte, kann entweder die TLV320AIC23B-Codecs oder auch beliebige andere Codecs verwenden, solange einer als Master und der andere als Slave arbeitet und beide auf den I2S-Modus mit 64FS und 20-Bit-Wortlänge eingestellt sind. Die Initialisierung dieser Codecs muss dann aber separat vorgenommen werden (wobei man dann wahrscheinlich nicht um einen uC drumrum kommt). Um das System zu testen (Programme und Koeffizienten in den DAP einzuspielen), wird lediglich eine serielle Schnittstelle verwendet. Wer will, kann aber genausogut den SPI-Modus verwenden und den DAP direkt von einem Mikrocontroller aus steuern. Zur Auswahl der verwendeten Schnittstelle (RS232 oder SPI) wird Pin 13 des B1-Connectors benutzt. Liegt dieser Pin auf GND, so wird der FPGA per RS232 gesteuert. Liegt dieser Pin auf 3.3V, so wird der FPGA per SPI gesteuert.&lt;br /&gt;
&lt;br /&gt;
Hier der Schaltplan meines verwendeten Audio-Boards.&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier noch die Pinbelegung des B1-Erweiterungssteckers:&lt;br /&gt;
&lt;br /&gt;
*01 GND&lt;br /&gt;
*02 VCC 5V&lt;br /&gt;
*03 VCC 3.3V&lt;br /&gt;
*04 N.C.&lt;br /&gt;
*05 SPI_CS - Chip Select (von uC nach FPGA)&lt;br /&gt;
*06 N.C.&lt;br /&gt;
*07 SPI_DI - SPI Data In (von uC nach FPGA)&lt;br /&gt;
*08 BCLK - Bit Clock (von Master Codec)&lt;br /&gt;
*09 SPI_CLK - SPI Clock (von uC nach FPGA)&lt;br /&gt;
*10 LRCLK - LR-Clock (von Master Codec)&lt;br /&gt;
*11 SPI_DO - SPI Data Out (von FPGA nach uC)&lt;br /&gt;
*12 SDOUT1 - zum D/A Wandler (Codec) 1&lt;br /&gt;
*13 IF_SEL - Interface Select (GND = RS232; VCC3.3 = SPI)&lt;br /&gt;
*14 SDIN1 - vom A/D Wandler (Codec) 1&lt;br /&gt;
*15 RXD_OUT - RS232 Signal vom MAX232 zum uC&lt;br /&gt;
*16 SDIN2 - vom A/D Wandler (Codec) 2&lt;br /&gt;
*17 TXD_IN - RS232 Signal vom uC zum MAX232&lt;br /&gt;
*18 SDOUT2 - zum D/A Wandler (Codec) 2&lt;br /&gt;
*19 GPO 3 - Chip-Select Codec 2&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 2 - Chip-Select Codec 1&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 1 - SPI-Data out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 0 - SPI-Clock Out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
&lt;br /&gt;
==Nexys Board==&lt;br /&gt;
&lt;br /&gt;
Im SVN Repository (s.u.) gibt es eine Version des DAPs für das Nexys Board.&lt;br /&gt;
Diese ist voll SW-Kompatibel zum alten Spartan 3 Board (allerdings z.Z. nur über RS232 steuerbar). Neu bei der Version ist das das Speicherinterface generisch ausgelegt wurde und ein einfacher SRAM-Controller für das Nexys Board PSDRAM geschrieben wurde. Durch das generische Interface ist es möglich andere Speicherarten anzubinden. Der verwendete Codec ist wie schon im bisherigen Projekt der TLV320AIC23B. Dieser wird via RS232 (6-pin Port A des Nexys Boards) über die GPO Leitungen (6-pin Port D des Nexys Boards) initialisiert. Die eigentlichen Datenleitungen des Codecs liegen an Port B (BCLK, LRCLK, DIN, DOUT).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download des DAP als MCS-File für das Nexys-1000 Board : [[Media:Nexys_dap.zip]]&lt;br /&gt;
&lt;br /&gt;
Diese Version ist voll lauffähig (wurde mit den Demos getestet).&lt;br /&gt;
Die Pin Belegung für die RS232 und den Audio-Codec ist wie folgt :&lt;br /&gt;
&lt;br /&gt;
Header A : RS232 Schnittstelle&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Pin 1 : RxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : TxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V/5V für MAX232/MAX3232)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header B : I2S Schnittstelle für 1 Codec&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : BitClk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : L/R Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : SDIN&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : SDOUT&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V für den Codec)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header D : Codec-Konfiguration via SPI&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : Codec 2 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : Codec 1 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : Codec SPI Data&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : Codec SPI Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DAP mit selbstgelötetem FPGA-Board==&lt;br /&gt;
&lt;br /&gt;
Auf einen Beitrag von Thomas Pototschnig hin bin ich auf sein selbstentworfenes Spartan-3-FPGA-Board (Grafikkarte) aufmerksam geworden. Thomas hat mir die Erlaubnis gegeben dieses Board für den DAP verwenden zu können und die Schaltpläne hier zu veröffentlichen. Nachdem ich von ihm noch einige Vorversionen (nur die Platinen) ergattern konnte und diese erfolgreich aufgebaut (mit Spartan 3-200 und -400) habe, bin ich von diesem Board echt begeistert. Danke nochmals.&lt;br /&gt;
&lt;br /&gt;
[[Bild:FPGA-Board.jpg|thumb|300px|left]]&lt;br /&gt;
&lt;br /&gt;
Hier Schaltplan und Layout. &lt;br /&gt;
&lt;br /&gt;
[[Media:miniFPGA-Board.zip]]&lt;br /&gt;
&lt;br /&gt;
Das Board ist zweiseitig und die &amp;quot;schlimmsten&amp;quot; zu lötenden Bauteile sind lediglich der FPGA (QFP-144) und die beiden RAMs (SOJ36, ekelig). Der Rest ist recht einfach. Auch die Inbetriebnahme des Boards gestaltete sich problemlos.&lt;br /&gt;
&lt;br /&gt;
Den Quellcode für den DAP musste ich etwas ändern und abspecken. Durch den ineffizienten VHDL-Code der MAC-Einheit gestaltete es sich schwierig, den Entwurf synthetisierbar zu machen. Das Synthetisieren auf einem FT256 gestaltete sich einfacher. Hier ist noch dergestalt Handlungsbedarf, dass die MAC-Einheit überarbeitet werden muss. &lt;br /&gt;
Der abgespeckte Entwurf läuft auf dem FPGA-Board mit einem Spartan 3-400 sowie auf einem Spartan 3-200. &lt;br /&gt;
Den Audio-Codec, das FPGA Board, einen AVR und noch etwas IO-Kram habe ich auf eine Lochrasterplatine aufgebaut. Was noch fehlt, sind MIDI- und SD/MMC-Karten-Schnittstellen. Dann hat man eine schöne Plattform für Synthesizer und Effektgeräte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anmerkung==&lt;br /&gt;
&lt;br /&gt;
Da, wie schon gesagt, das Projekt komplett auf meinem &amp;quot;Mist&amp;quot; gewachsen ist, wird es wohl noch eine Weile dauern, bis alles, was den DAP betrifft, hier in diesem Artikel (und auch in einem Dokumentations-PDF) eingearbeitet ist. Ich werde (sofern ich Zeit dazu habe) noch ein Delphi-Programm mit Sourcecode einstellen, welches den DAP richtig nutzbar macht, so dass man dann direkt damit &amp;quot;spielen&amp;quot; kann. Eine umfangreiche und vollständige Dokumentation würde momentan einfach zu viel Zeit in Anspruch nehmen, und ich möchte langsam das Projekt vorstellen, um Anregung, Kritik und Verbesserungsvorschläge ernten zu können. Ich hoffe, weitere Leute zu finden, um diesem Projekt noch mehr Leben und Möglichkeiten einhauchen zu können.&lt;br /&gt;
&lt;br /&gt;
==Fotos==&lt;br /&gt;
&lt;br /&gt;
Ursprüngliche Version:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Gesamt_wo_uc.jpg|thumb|200px|left|Spartan.3-Board und Expansion-Board]]&lt;br /&gt;
[[Bild:Codecs.jpg|thumb|200px|left|Expansion Board]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nexys-Board:&lt;br /&gt;
[[Bild:dap_nexys_v1.jpg|thumb|200px|left|Nexys-Board mit 1 Audio-Codec]]&lt;br /&gt;
[[Bild:Nexys-board-gesamt.jpg|thumb|200px|left|Nexys-Board mit Lochraster-Board und 2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
[[Bild:Nexys-board-codecs-1.jpg|thumb|200px|left|2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufbau von [[Benutzer:Andreas]]:&lt;br /&gt;
[[Bild:Nexys-Audio-DSP-Foto-Andreas.jpg|thumb|600px|left|Nexys + Breadboard + 1 [[Audio Codec Board]]]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Synth-gesamt-klein.jpg|thumb|500px|left|Aufbau des DAPs mit FPGA-Board (entworfen von Thomas Pototschnig) auf Lochraster an AVR, Codec und weiterer IO]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap-Synth-01.jpg|thumb|300px|left|Synth Board. DAP mit AVR,Codec, MIDI-Interface, RS232 (schaltbar) und LCD]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_Ansicht_02.jpg|thumb|300px|left|Synth Board. Komplettansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_klein_3.jpg|thumb|600px|left|Synth Board. Synth-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Oben.jpg|thumb|300px|left|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Unten.jpg|thumb|300px|right|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Träger-und-Mainboard.jpg|thumb|600px|left|Selbstgeroutetes DAP-Board auf Trägerplatine]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Seite.jpg|thumb|300px|left|DAP-Board mit Touch-Display Seitenansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display.jpg|thumb|600px|left|DAP-Board mit Touch-Display]]&lt;br /&gt;
&lt;br /&gt;
Diese Version des DAP hat ein Grafikdisplay incl. Touchpanel. Die Ansteuerung übernimmt der FPGA. Dort ist einer kleiner &amp;quot;Grafik-Prozessor&amp;quot; integriert, der das Update des Displays und das Kopieren der Bitmaps übernimmt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synthesizer Ansicht 1.jpg|thumb|600px|left|]]&lt;br /&gt;
Synth-Board. Komplettansicht in einem Cherry-Tastaturgehäuse (wie dafür gemacht :-)) im Synthesizer-Stil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synth Komplett.jpg|thumb|600px|left|Fertige Version des DAP als Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
Der komplette Synthesizer mit schicker Frontplatte und passendem (oben schon erwähnten :-)) Cherry-Tastatur-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Version 1.5.jpg|thumb|600px|left|Heue Hardwareversion der DAP-Hauptplatine]]&lt;br /&gt;
&lt;br /&gt;
Diese Version beinhaltet folgendes : :-) &lt;br /&gt;
&lt;br /&gt;
 - Xilinx XC3S400&lt;br /&gt;
 - ATmega2561&lt;br /&gt;
&lt;br /&gt;
 - 16 MByte (8Mx16) SDRAM&lt;br /&gt;
 - µSD Card Slot&lt;br /&gt;
 - AT45DB321 DataFlash&lt;br /&gt;
 - 24C512 EEProm&lt;br /&gt;
&lt;br /&gt;
 - TLC320AI23B Audio Codec mit Kopfhörer Ausgang&lt;br /&gt;
 - CS5343 A/D Wandler&lt;br /&gt;
 - CS4344 D/A Wandler&lt;br /&gt;
&lt;br /&gt;
 - MIDI&lt;br /&gt;
 - RS232&lt;br /&gt;
 - etlichen IO-Pins vom AVR und FPGA&lt;br /&gt;
 - 2 separaten Clock-Oszillatoren (nicht bestückt)&lt;br /&gt;
&lt;br /&gt;
... und weiterem Kleinkram (Level-Shifter, LDO, Platform-Flash, usw ... und vielen 100nF-Kondensatoren)&lt;br /&gt;
&lt;br /&gt;
Ideal zum Aufbau einer Audioplattform. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audio-Demos==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein EQ-Demo mit rosa Rauschen. Klingt wie eine Meeresbrandung.&lt;br /&gt;
&lt;br /&gt;
[[Media:eq_demo1.zip]]&lt;br /&gt;
&lt;br /&gt;
Der DAP als Synth. Der DAP wird komplett vom PC aus gesteuert (Hüllkurve, Sequencer und Filterberechnung werden im PC gemacht).&lt;br /&gt;
&lt;br /&gt;
[[Media:synthdemo1.wav.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MC505-Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen von meiner Roland MC505 Groovebox. Es wird einfach nur ein Werkspreset abgespielt und durch den DAP gejagt.&lt;br /&gt;
&lt;br /&gt;
* [[Media:mc505-eq-demo.wav.zip|EQ-Demo]]&lt;br /&gt;
* [[Media:mc505-filter-demo.wav.zip|Filter-Demo (Tiefpass/Hochpass/Notch)]]&lt;br /&gt;
* [[Media:mc505-delay-demo.wav.zip|Delay-Demo (137BPM [657ms &amp;amp; 876 ms]/Chorus)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Synth-Board Audio-Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen vom DAP in Verbindung mit einem AVR, der die Filterkoeffizientenberechnung sowie eine komplette Synthesizersteuerung beinhaltet, also quasi einen Synthesizer aus dem DAP macht (inkl. MIDI-Steuerung).&lt;br /&gt;
&lt;br /&gt;
MIDI-Sequenz und Tiefpassfilter (Filter und Modulation über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-01.mp3]]&lt;br /&gt;
&lt;br /&gt;
Dieselbe MIDI-Sequenz mit Hochpassfilter (Filter und Modulation ebenfalls über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-02.mp3]]&lt;br /&gt;
&lt;br /&gt;
Eine eher Techno-ähnliche Demo, welche die Auflösung des Systems (DAP+AVR+MIDI) ein wenig zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap_syn_demo_03.mp3]]&lt;br /&gt;
&lt;br /&gt;
==Delphi Tools==&lt;br /&gt;
&lt;br /&gt;
Um den DAP nutzbar zu machen benötigt man entweder ein uC Programm oder ein PC Programm. Da das verwenden von PC-Programmen einfacher fürs Spielen und Experimentieren ist, werde ich hier im Laufe der Zeit kleine Demo-Programme aber auch komplette Front-Ends für den DAP reinstellen. Die Delphi-Programme sind allesamt in Turbo-Delphi geschrieben und die dazugehörigen Quellcodes werden ebenfalls im Laufe der Zeit geuploaded. Ich werde allerdings zuerst noch das Feature des Konfigurierens der Codecs vom PC aus einbauen. &lt;br /&gt;
Nachtrag zum Konfigurieren des Codecs : Prinzipiell funktioniert es, allerdings ist das mit häßlichen Nebengeräuschen verbunden, da ich bei jeder Änderung der Lautstärke im Codec, diesen auch Resetten muß, da sonst immer beide Codecs beschrieben werden, was unschön ist. Warum dies so ist kann ich leider nicht sagen, da ich keine Möglichkeit habe die SPI-Leitungen mitzusniffen (bräuchte dafür einen kleinen LA, den ich nicht habe). &lt;br /&gt;
&lt;br /&gt;
* Demo eines 3 Band Stereo Equalizers. (Der Knopf &amp;quot;MoveIt!&amp;quot; bringt Leben ins Demo): [[Media:dap_eq_demo.zip]]&lt;br /&gt;
* Demo eines 4 Kanal Mono Mixers mit Monitor (Vorhör)-Ausgang: [[Media:dap_mix_demo.zip]]&lt;br /&gt;
* Demo eines Synthesizer-Filters: [[Media:dap_filter_demo.zip]]&lt;br /&gt;
* Demo eines 2 Kanal Delays (Der Button &amp;quot;MoveIt!&amp;quot; macht daraus einen Chorus :-))): [[Media:dap_delay_demo.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Quellcodes für das EQ-Demo, das Filter-Demo und das Delay-Demo : [[Media:dap_demos_plus_delphi_source.zip]]&lt;br /&gt;
&lt;br /&gt;
Es folgen noch der Quellcode für den Mischer (hab ich gerade nicht zur Hand) und weitere Demos (ein Synthesizer und eine 4x4 Patchbay mit EQ und was mir sonst noch einfällt. Dann natürlich mit Source-Codes).&lt;br /&gt;
Anhand dieser Beispiele wird auch eine grobe Doku erstellt.&lt;br /&gt;
&lt;br /&gt;
== SVN-Repository ==&lt;br /&gt;
&lt;br /&gt;
 svn co svn://mikrocontroller.net/audiodsp&lt;br /&gt;
&lt;br /&gt;
Ein automatisch aktualisiertes Paket mit den Daten aus dem Repository gibt es unter http://www.mikrocontroller.net/download/audiodsp-snapshot.tar.gz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
&lt;br /&gt;
* 12.07.2007: Es wurde ein generisches Speicherinterfaces implementiert, welches Wartezyklen im DAP erlaubt. Dadurch kann man auf die jeweilgen Speicher des Boards eingehen. Z.Zt. ist nur eine einfaches Speicherschnittstelle für den asynchronen Betrieb des PSDRAM des Nexys-Boards implementiert. Die Schnittstelle ermöglicht den Anschluss eines RAM-Controller, welcher z.&amp;amp;nbsp;B. ein Quasi-Multiport-RAM darstellt. Getestet wurde der Stand mit dem Nexys-1000-Board.&lt;br /&gt;
&lt;br /&gt;
==To do==&lt;br /&gt;
&lt;br /&gt;
* nähere Zukunft&lt;br /&gt;
** Einen Konfigurationsdialog in die Demo-Programme einarbeiten mit denen man mit den Codecs etwas spielen kann (Line-In Level, Mikrofon-Level, Bypass, Head-Phone Volume) tlw. erledigt. Funktioniert aber nicht richtig, und daher noch nicht eingebaut. Quellcodes dazu sind vorhanden.&lt;br /&gt;
** Doku anhand der Demo-Programme erstellen&lt;br /&gt;
** C-Code schnipsel erstellen&lt;br /&gt;
&lt;br /&gt;
* fernere Zukunft&lt;br /&gt;
** Front-End des DAPs machen, mit dem sich DAP-Programme erstellen lassen, der Koeffizienten-, Daten- und Wellenform-Speicher beschrieben und gelesen werden kann, der Mikro-Code editierbar gemacht wird und noch ein paar Sachen mehr machbar sind&lt;br /&gt;
** weitere Module für den Rahmen (HDD-Core, weitere Routing-Möglichkeiten innerhalb der bisherigen Cores SDSP und Util)&lt;br /&gt;
&lt;br /&gt;
==Diskussion==&lt;br /&gt;
* http://www.mikrocontroller.net/topic/65205&lt;br /&gt;
* http://www.mikrocontroller.net/topic/34376&lt;br /&gt;
&lt;br /&gt;
Falls Interesse an einer Sammelbestellung für die Platinen und Bauteile besteht &lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/144288&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]] &lt;br /&gt;
[[Kategorie:Audio]]&lt;br /&gt;
[[Kategorie:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66886</id>
		<title>Audio-DSP mit Spartan 3-FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66886"/>
		<updated>2012-06-14T22:10:09Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* Feature-Liste */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [[Benutzer:TheMason]]&lt;br /&gt;
&lt;br /&gt;
==Ziel==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projekts ist es der Aufbau einer FPGA-basierten Plattform, mit der es möglich ist Synthesizer, Effektgeräte, Mischpulte oder gar ein Harddiskrecording-System zu realisieren.&lt;br /&gt;
&lt;br /&gt;
==Feature-Liste==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften des Audioprozessors: &lt;br /&gt;
&lt;br /&gt;
* Oszillatoren&lt;br /&gt;
* Biquads (Filter)&lt;br /&gt;
* Addierer, Schalter, Verstärker (Multiplizierer)&lt;br /&gt;
* Delays&lt;br /&gt;
* Steuerung des Audioprozessors via SPI oder RS232&lt;br /&gt;
* 4 Mono Ein- und Ausgänge&lt;br /&gt;
* GPO (General-Purpose-Outputs) zur Konfiguration der Codecs&lt;br /&gt;
&lt;br /&gt;
==Übersicht==&lt;br /&gt;
[[Bild:Overview_wo_uc.jpg|thumb|500px]]&lt;br /&gt;
Basis des Audio-Systems ist das Xilinx Spartan 3-Development Board. An diesem Board werden 2 Audio-Codecs angschlossen von denen einer als Master und der andere als Slave agiert. Optional kann noch ein Mikrocontroller angeschlossen werden welcher den FPGA per SPI steuert. Da dieses Projekt mittlerweile recht umfangreich geworden ist, kann ich hier nur einen kurzen Umriss des Systems geben. Dabei beschränke ich mich auf die grobe Funktionsweise des Audio-Prozessors, erläutere das Interface (welches ich als Basis für weitere Projekte bereits nutze) und gebe einen kleinen Überblick über die Hardware.&lt;br /&gt;
&lt;br /&gt;
Das System kann (sofern man 2 Audio-Codecs, von denen einer als Master, der andere als Slave arbeitet, angeschlossen und konfiguriert hat) direkt genutzt werden, da der DAP per RS232 gesteuert werden kann. Der Audio-Prozessor startet mit einem Stereo-Tiefpass-Filter der sich auf den ersten Codec bezieht,&lt;br /&gt;
sodass man ein erstes Demo hat (selbst wenn es etwas unspektakulär ist)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nachbau==&lt;br /&gt;
&lt;br /&gt;
Wer sich dieses System nachbauen möchte, benötigt zunächst ein FPGA-Board. Mit dem Spartan-3-Board von Digilent gestaltet sich der Nachbau einfach, weil die Programmier-Dateien für den FPGA direkt für dieses Board verwendet werden können. Nutzer anderer Boards (Xilinx) müssten zuerst die UCF-Datei für die Pins ihres jeweiligen Boards anpassen, und dieses Projekt neu synthetisieren (compilieren). Nutzer von Altera-Boards hingegen müssen die BlockRAM-Instanzen auf die Altera-Architektur anpassen (den Inhalt der RAMs dabei nicht vergessen :-). Vielleicht findet sich ja der eine oder andere der den VHDL Code für Altera-FPGAs portiert.&lt;br /&gt;
Der eigentliche wichtige Teil eines Nachbaus ist der Codec-Teil. Dieses System verwendet zwar zwei Codecs, aber es kann auch mit einem gearbeitet werden. Als Codec kommt der TLV320AIC23B von Texas Instruments zum Einsatz. Diesen kann man als kostenloses Muster bei TI direkt bekommen. &lt;br /&gt;
Des weiteren benötigt man noch eine handvoll Bauteile wie Kondensatoren, Widerstände und einen Quarz. (Ein Codec MUSS als Master laufen, sonst hat das System keine Audio-Clocks, da diese nicht vom FPGA generiert werden)&lt;br /&gt;
Die Initialisierung des Codecs wird vom PC aus gemacht. Dazu dienen die 4 GPO-Leitungen auf dem B1-Verbinder. Da der Codec nur &amp;quot;halbes&amp;quot; SPI unterstüzt (man kann nur schreiben, nicht lesen) gestaltet sich die Initialisierung recht einfach.&lt;br /&gt;
Die 4 GPO-Leitungen teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* Chip-Select Codec 2&lt;br /&gt;
* Chip-Select Codec 1&lt;br /&gt;
* SPI Data Out&lt;br /&gt;
* SPI Clock&lt;br /&gt;
&lt;br /&gt;
==Audio-Prozessor (DAP)==&lt;br /&gt;
&lt;br /&gt;
[[bild:Overview dap core.JPG|thumb|500px|right]]&lt;br /&gt;
&lt;br /&gt;
Der FPGA beinhaltet in dem gesamten System einen Quasi-DSP. Quasi-DSP deshalb, da die Struktur im Gegensatz zu einem DSP bzw. Mikrocontroller keine Verzweigungen, Interrupts oder ähnliches zulässt. Der Audio-Prozessor besteht im wesentlichen aus 3 Teilen : einem Rahmen, einem SDSP (Small DSP)-Kern &lt;br /&gt;
sowie einem Utility-Kern. Beide Kerne können theoretisch parallel arbeiten, da jeder Kern einen eigenen Zustandsautomaten und einen eigenen Microcode-Speicher besitzen. Diese Möglichkeit ist allerdings noch nicht implementiert.&lt;br /&gt;
&lt;br /&gt;
Der SDSP-Kern besteht im wesentlichen aus einer MAC-Einheit, einem Speicher für Audiodaten, einem Koeffizienten-Speicher, einem Adressgenerator und mehreren Muxern, sowie dem schon angesprochenen Zustandsautomaten und dem Microcode. Weiterhin ist ein Hidden-Write- (bzw. Shadow Register) Mechanismus integriert,&lt;br /&gt;
welcher ein &amp;quot;knackserfreies&amp;quot; Aktualisieren von Koeffizienten ermöglicht. Alle diese Komponenten werden vom Microcode aus gesteuert (genau wie bei einem Mikrocontroller). Mit diesem Kern ist es möglich, Audiosignale zu bearbeiten. Zu Den Bearbeitungsmöglichkeiten zählen in erster Linie das Verändern der Lautstärke, Mischen, Filtern (Biquad) sowie Laden und Speichern von &lt;br /&gt;
Audiowerten.&lt;br /&gt;
&lt;br /&gt;
Der Utility-Kern besteht aus einem Akkumulator (für DDS), einem Shaper, einem Adressgenerator, einem Wavetable-Speicher, einem Zufallszahlengenerator, einigen Muxern, (einem Adressgenerator für SRAM, einem SRAM-Controller; diese sind allerdings nur nutzbar, wenn man das ganze mit dem ISE 6.2 synthetisiert) &lt;br /&gt;
und dem schon angesprochenen Zustandsautomaten und dem Microcode. Der Microcode steuert (genau wie beim SDSP-Kern) dabei die einzelnen Komponenten des Utility-Kerns. Dieser Kern ist für das Erzeugen von Audiosignalen zuständig, und erlaubt ein Audiosignal zu verzögern, sofern man die ISE-Version 6.2 verwendet (später dazu mehr). Als Wellenformen stehen Sägezahn, Rechteck (mit veränderbarer Pulsbreite), Rauschen sowie benutzderdefinierbare Wellenformen (Wavetable) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Der Rahmen besteht aus einem Zustandsautomaten, einem Programmspeicher, einigen Muxern, sowie einem doppelten I2S-Sender/Empfänger (für 2 Stereo Ein- und Ausgänge). In den Rahmen werden die beiden Kerne &amp;quot;eingehängt&amp;quot;. Die Kerne werden vom Programmspeicher aus mit Daten versorgt, und vom Zustandsautomaten angesteuert. Der Programmspeicher (PMEM) ist als 512x32 Bit organisiert. Das heißt, dass ein Befehl im Programmspeicher 32 Bit an Informationen enthält und der Audioprozessor max. 512 Befehle umfassen kann.&lt;br /&gt;
&lt;br /&gt;
===SDSP-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:SDSP-Struct.jpg|thumb|300px|left|Struktur des SDSP-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Der eigentliche Kern des DAPs ist die MAC-Einheit. Mit ihr werden die grundlegenden Operationen Multiplikation und Addition durchgeführt. Es ist eine 32x32-Bit-Einheit. &lt;br /&gt;
Die Funktionsweise des Kerns ist eigentlich recht einfach. &lt;br /&gt;
Die MAC-Einheit hat 2 Eingänge. Einer dieser Eingänge kann ein Audiosignal, ein Wert aus dem Audiospeicher (AMEM-BlockRAM) oder ein zuvor berechnetes Ergebnis sein. Der andere Eingang kann ein Koeffizient aus dem CMEM-BlockRAM oder eine Konstante (1.000, 0.000 oder -1.000) sein.&lt;br /&gt;
Der Ausgang (32-Bit, hart geclippt) geht auf das AMEM-BlockRAM und zum Ausgangs-Clipping. Das Ausgangsclipping schneidet das Audiosignal auf 24-Bit zurecht.&lt;br /&gt;
Die Adressen für die Speicher (AMEM und CMEM) werden im Addressgenerator erzeugt. Dieser wird von außen mit einer 8-Bit-Basis-Adresse gespeist und erzeugt einen Offset zu den Eingangsadressen. Er besitzt 2 setzbare Zähler und einige Multiplexer.&lt;br /&gt;
Alle Steuersignale der Komponenten von einem weiteren aus BlockRAM (MMEM) versorgt. Weiterhin wird von außen eine Startadresse vorgegeben. Dadurch lassen sich quasi Opcodes mit von außen vorgegeben Parametern (Adressen) aufrufen.&lt;br /&gt;
Das MMEM-BlockRAM wird nun einfach nur linear ausgelesen bis ein Stopbit gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Util-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Util-Core.jpg|thumb|300px|left|Struktur des Utility-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Beschreibung folgt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opcodes des DAP===&lt;br /&gt;
&lt;br /&gt;
Diese 32 Bit eines Befehls teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* 4 Bit = Opcode (für SDSP und Utility Kern gleich)&lt;br /&gt;
* 2 Bit = noch leer&lt;br /&gt;
* 1 Bit = Core Select (SDSP oder Utility)&lt;br /&gt;
* 1 Bit = Ende des Programms&lt;br /&gt;
* 4 Bit = Eingangsrouting (Kanal 1 - 4, Ergebnis SDSP-Kern, Ergebnis Utility-Kern)&lt;br /&gt;
* 4 Bit = Ausgangsrouting (SDSP-Ausgang auf Kanal 1-4, Utility-Ausgang auf Kanal 1-4)&lt;br /&gt;
* 8 Bit = Adresse 1 (bei SDSP für Audio-Memory, bei Utility-Kern für Datenspeicher)&lt;br /&gt;
* 8 Bit = Adresse 2 (bei SDSP für Koeffizientenspeicher, bei Utility-Kern unbenutzt)&lt;br /&gt;
&lt;br /&gt;
Das Eingangsrouting bestimmt, mit welchem Signal der gewählte Kern arbeiten soll. Dies können die Eingänge 1-4 aber auch ein vorher berechnetes Ergebnis des SDSP- bzw. Utility-Kerns sein. Das Ausgangsrouting bestimmt, von welchem Kern das Signal auf welchen Ausgang geroutet wird.&lt;br /&gt;
&lt;br /&gt;
Die Opcodes des DAPs sind:&lt;br /&gt;
&lt;br /&gt;
SDSP-Kern:&lt;br /&gt;
* Biquad rechnen&lt;br /&gt;
* Audiowert speichern&lt;br /&gt;
* Audiowert laden&lt;br /&gt;
* Move eines Wertes im Audiospeicher&lt;br /&gt;
* Summe rücksetzen&lt;br /&gt;
* Eingang zu Summe addieren&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe addieren&lt;br /&gt;
* Eingang zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Lautstärke &lt;br /&gt;
&lt;br /&gt;
Utility-Kern:&lt;br /&gt;
* Oszillator (DDS-Teil)&lt;br /&gt;
* Waveshaper&lt;br /&gt;
* Verzögerung&lt;br /&gt;
&lt;br /&gt;
Der Ablauf eines Audio-Programms ist folgender:&lt;br /&gt;
&lt;br /&gt;
Sobald ein neues Sample anliegt, wird die Abarbeitung des Programms von Adresse 0x0000 an im PMEM angestoßen. Es wird dabei jeweils ein Befehl geladen und Daten wie Opcode und Adressen liegen dabei an beide Kernen gleichermaßen an. Ist das Programm-Ende-Bit nicht gesetzt, so wird der jeweilige Kern (mit dem im Opcode angegeben Routing) angesteuert. Legt der betreffende Kern sein Ready-Signal auf 1, so wird der nächste Befehl abgearbeitet. Dieses Verhalten (Laden und Verteilen von Opcode-Daten sowie die Ablaufsteuerung, also das Ansteuern des Programms, Ansteuern der einzelnen Kerne, warten auf dessen Abarbeitung und das Programmende) wird vom Rahmen übernommen.&lt;br /&gt;
&lt;br /&gt;
===Speicherorganisation===&lt;br /&gt;
&lt;br /&gt;
Alle Speicher die vom DAP angesprochen werden, haben eine Wortbreite von 32 Bit, der Zugriff erfolgt aber ausschließlich über eine Breite von 8 Bit (Interface).&lt;br /&gt;
&lt;br /&gt;
DAP&lt;br /&gt;
* Programmspeicher 	(PMEM)   0x0000 - 0x07ff&lt;br /&gt;
&lt;br /&gt;
SDSP&lt;br /&gt;
* Audiospeicher   	(AMEM)   von außen nicht zugänglich&lt;br /&gt;
* Koeffizientenspeicher 	(CMEM)   0x2000 - 0x2023  (man &amp;quot;sieht&amp;quot; nur den Hidden Write -&amp;gt; später mehr dazu)&lt;br /&gt;
* Microcodespeicher      (MMEM)   0x4000 - 0x47ff&lt;br /&gt;
&lt;br /&gt;
Utility-Core&lt;br /&gt;
* Datenspeicher          (DMEM)   0x6000 - 0x67ff&lt;br /&gt;
* Wavetable-Speicher      (WMEM)   0x8000 - 0x87ff&lt;br /&gt;
* Microcodespeicher      (UMEM)   0xa000 - 0xa7ff&lt;br /&gt;
&lt;br /&gt;
===Hidden-Write===&lt;br /&gt;
Um bei Änderung der Koeffizienten Knackser zu vermeiden (die dadurch entstehen das der Koeffizient nur teilweise [durch 8-Bit-Zugriffe] geändert wird, währenddessen aber Audio trotzdem noch &amp;quot;weiterläuft&amp;quot; und mit &amp;quot;falschen&amp;quot; Zwischenwerten gerechnet wird), ist ein Mechanismus implementiert, der die zu ändernden Koeffizienten im Hintergund in den Speicher schreibt. Um diesen Mechanismus zu nutzen, müssen zuerst die Koeffizienten in interne Register&lt;br /&gt;
geschrieben werden. Die Register (es sind 8 32-Bit-Register) liegen im Speicherbereich 0x2000 bis 0x201f. Die Speicherstelle 0x2020 gibt die Startadresse innerhalb des Koeffizientenspeichers an. Diese Adresse ist nur 8 Bit breit. Die Speicherstelle 0x2021 gibt an, wieviele der 8 Register übertragen werden sollen. Die Speicherstelle 0x2022 löst den Kopiervorgang aus. Hier reicht es, ein Dummy-Byte zu schreiben. Um den Kopiervorgang zu beenden (MUSS GEMACHT WERDEN!, sonst können keine weiteren Koeffizientenupdates gemacht werden), schreibt man an Speicherstelle 0x2023 ebenfalls ein Dummy-Byte.&lt;br /&gt;
&lt;br /&gt;
===I/O Register===&lt;br /&gt;
&lt;br /&gt;
Es gibt noch einen 8-Bit breiten Adressbereich innerhalb des DAPs, mit dem der I2S-Teil stummgeschaltet werden kann. Weiterhin hat man die Möglichkeit, die Anzahl der Systemtakte pro Sample und die Anzahl der aktiven Systemtakte (also die Zeit die der Audioprozessor beschäftigt ist) zu ermitteln. Dadurch lässt sich eine Auslastungsanzeige des DAPs realisieren.&lt;br /&gt;
&lt;br /&gt;
===Interface===&lt;br /&gt;
&lt;br /&gt;
Um von außen nun ein Programm (bzw. Koeffizienten und Daten) zu laden, ist eine einfach zu handhabende und erweiterbare Schnittstelle implementiert. Die Schnittstelle kann per RS232 (fest eingestellt auf 115,2kBaud) oder per SPI (wird hardwaremäßig eingestellt) angesteuert werden. Die Schnittstelle in ihrer Gesamtheit ist schichtweise aufgebaut und beginnt mit einem Daten-Dispatcher. Dieser Daten-Dispatcher entscheidet (nachdem dieser selektiert wurde) mit dem ersten Byte, an welches angeschlossene Gerät der weitere Datenstrom geleitet wird.&lt;br /&gt;
&lt;br /&gt;
Als angeschlossene Geräte sind im aktuellen Entwurf ein Gerät namens &amp;quot;StdIO&amp;quot; und der Audioprozessor verfügbar.&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;StdIO&amp;quot;-Gerät steuert die 7-Segment-Anzeige (16-Bit-Hexadezimalanzeige oder 32-Bit-Einzelsegmentanzeige) sowie die 8 Leuchtdioden, und erlaubt es, die 3 Drucktaster sowie die 8 Schiebeschalter auszulesen.&lt;br /&gt;
&lt;br /&gt;
Der Audioprozessor besteht (schnittstellenseitig) nur aus einer Speicherzugriffsschnittstelle. Diese Schnittstelle entscheidet mit dem ersten Byte (sobald es selektiert wurde), ob in den Speicher geschrieben, von diesem gelesen, ein I/O-Schreib- oder -Lesezugriff erfolgen soll.&lt;br /&gt;
Die folgenden 2 Bytes (im Falle eines I/O-Zugriffs nur 1 Byte) bestimmen die Adresse und damit den Speicherbereich des Audioprozessors, auf den zugegriffen werden soll. Die Speicherschnittstelle besitzt einen Autoinkrementierer,&lt;br /&gt;
mit dem fortlaufende Bytes einfach hintereinander geschrieben werden können, ohne dass jedes mal wieder der FPGA, das Gerät und die neue Adresse neu geschrieben werden müssen, was den Zugriff erheblich beschleunigt.&lt;br /&gt;
&lt;br /&gt;
Ursprünglich basierte das System auf einem SPI-Interface. Dabei wurde die Chip-Select-Leitung als &amp;quot;globaler&amp;quot; Interface-Reset betrachtet, d.h. war die Leitung auf High, war der FPGA deselektiert und und alle Interface-Zustandsautomaten wurden im Reset gehalten. Erst mit dem Setzen dieser Leitung wurde der FPGA angesprochen. (erstes Byte -&amp;gt; Daten-Dispatcher, folgende Bytes gehen an das ausgewählte Gerät). Weiterhin hat SPI die Eigenschaft, dass mit jedem gesendeten Byte auch eines empfangen wurde. Der Umstand, dass RS232 weder eine Chip-Select Leitung benötigt noch eine synchrone Übertragung erzwingt, führt zu dem Umstand, dass man bei Nutzung von RS232 einige Befehle zusätzlich benötigt. Diese Befehle werden durch das Zeichen 0x1b (ESC) eingeleitet. Soll statt der &amp;quot;Spezialfunktion&amp;quot; das Byte 0x1b übertragen werden, so wird dieses einfach erneut gesendet. Soll die Chip-Select-Leitung gesetzt bzw. gelöscht werden, so wird die Sequenz 0x1b 0x00 (Selektieren) bzw.&lt;br /&gt;
0x1b 0x01 (Deselektieren) gesendet. Soll ein zuvor im Ausgangsregister gesetztes Byte gesendet werden, so muss die Sequenz 0x1b 0x02 gesendet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
0x121b auf dem 7-Segment-Display per RS232 anzeigen:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x00      (Hi-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x12      (Wert 12)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x01      (Lo-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x1b 0x1b (Wert 1b -&amp;gt; zu beachten: wenn der Wert 0x1b übertragen werden soll, muss dieser doppelt gesendet werden !!)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Beispiel, um in den Programmspeicher des Audioprozessors an Adresse 0x0010 das Langwort 0x12233445 zu schreiben:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf1      (DAP selektieren)&lt;br /&gt;
*- 0x00      (Speicher schreiben)&lt;br /&gt;
*- 0x00      &lt;br /&gt;
*- 0x10      (Adresse 0x0010 -&amp;gt; PMEM-Adresse 0x010)&lt;br /&gt;
*- 0x12	    (Adresse 0x0010 -&amp;gt; 0x12)	&lt;br /&gt;
*- 0x23	    (Adresse 0x0011 -&amp;gt; 0x23, autoincrement)&lt;br /&gt;
*- 0x34      (Adresse 0x0012 -&amp;gt; 0x34, autoincrement)&lt;br /&gt;
*- 0x45      (Adresse 0x0013 -&amp;gt; 0x45, autoincrement)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Auslesen der 8 Schalter:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x04      (Schalter auslesen)&lt;br /&gt;
*- 0x00	    (dummy byte -&amp;gt; überträgt Schalterstellung in Ausgaberegister)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man die 8 Schalterstellungen binärcodiert)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Der Datendispatcher (welcher mit dem ersten Byte nach dem Selektieren des FPGAs [0x1b 0x00] angesprochen wird) hat weiterhin einige nützliche Funktionen, die in ihrer Gesamtheit allerdings noch nicht ausführlich getestet wurden. Darunter sind Funktionen, mit denen Informationen über die an den Ports des Daten-Dispatchers angeschlossenen Geräte zu ermitteln. Diese Funktion kann dazu genutzt werden, um zu ermitten, welche Geräte im FPGA implementiert sind und an welchen Ports welche Geräte angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
Anzahl der Ports des Daten-Dispatchers liefern:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xed      (Anzahl Ports lesen)&lt;br /&gt;
*- 0x00      (dummy byte -&amp;gt; überträgt Inhalt des Ausgaberegisters)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man 0x22)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
===DAP-Modul-Schnipsel===&lt;br /&gt;
&lt;br /&gt;
Um mal &amp;quot;eben&amp;quot; mit dem DAP zu spielen, ein paar Schnipsel die sich recht leicht zu kompletten Funktionsblöcken zusammenschließen lassen.&lt;br /&gt;
Es werden hier nur die RS232-Sequenzen mit einer kurzen Erklärung aufgelistet.&lt;br /&gt;
&lt;br /&gt;
*Dual Mono Biquad&lt;br /&gt;
&lt;br /&gt;
*ESC 0x00 - FPGA selektieren&lt;br /&gt;
*0xF1     - DAP auswählen&lt;br /&gt;
*0x00 0x00 0x00 - Memory Write (Adresse 0x0000 -&amp;gt; Program Memory)&lt;br /&gt;
*0x10 0x00 0x00 0x08 - Biquad mit Kanal 1 (0) rechnen (AMEM = 0x00;CMEM = 0x08) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x10 0xf0 0x08 0x10 - Biquad mit vorherigem Ergebnis (0xf) rechnen (AMEM = 0x08; CMEM = 0x10) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x01 0x00 0x00 0x00 - Audioprogramm Ende (wichtig !!!)&lt;br /&gt;
*ESC 0x01 - DAP &amp;amp; FPGA deselektieren&lt;br /&gt;
&lt;br /&gt;
Erklärung :&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Opcodes 0x100008 deutet an, dass ein Biquad durchgerechnet werden soll. Das Eingangsregister 0 bedeutet, dass Kanal 1 des 1. Codecs verwendet wird. Das Ausgangsregister, welches nach Fertigstellung des Ergebnisses benutzt werden soll, ist 0 (-&amp;gt; Kanal 1 des 1. Codecs). Der Teil 0x00 0x08 bedeutet hierbei, dass die Biquad-Koeffizienten im CMEM ab Adresse 0x08 stehen. Die Audio-Zwischenwerte werden in den Audiospeicher AMEM ab Adresse 0x00 gelegt.&lt;br /&gt;
Der zweite Opcode (0x10f00810) rechnet ebenfalls ein Biquad durch. Nur dass hier statt Kanal 1 des Codecs das voher vom SDSP berechnete Ergebnis verwendet werden soll (Kanal 0xf, wenn man so will). Ausgangsregister ist auch hier wieder Kanal 1. Da dieser Biquad unabhängig vom ersten (d.h. mit anderen Parametern) gerechnet werden soll, sind hier logischerweise auch andere Adressen für AMEM (0x08) und CMEM (0x10) angegeben. Die CMEM-Adresse ist dabei etwas unkritischer, da es ja durchaus sein kann, dass ein Audiosignal zweimal mit den selben Biquad-Werten gerechnet werden soll, bzw. unterschiedliche Kanäle mit den selben Biquad-Werten, z.b. bei einem Stereo-Equalizer. Kritischer ist allerdings die Verwendung der AMEM-Adresse. Diese sollte für jede Operation (sofern AMEM denn verwendet wird) unterschiedlich sein, vor allem bei der Berechnung von Biquads. Dies hat den Grund, dass bei Operationen, die dieselben AMEM Adressen haben, die vorher berechneten Werte überschrieben werden. Dies ist bei Biquads gaanz böse (kann u.U. SEHR laut werden), und vom Ergebnis her nicht vorhersagbar.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
[[bild:Fpga_ext_board_schematic_no_uc.JPG|thumb|500px]]&lt;br /&gt;
&lt;br /&gt;
Wie Eingangs erwähnt, benötigt das System eine (bzw. zwei) Audio-Codecs. Im aktuellen Schaltplan wird auf einen Mikroprozessor verzichtet. Dieser diente im System primär zu Initialisierung der Codecs. Dieser Vorgang kann nun vom PC aus gesteuert werden, da in der neuen ISE-6.2-Version 4 Leitungen herausgeführt wurden, welche per RS232 gesetzt und gelöscht werden. &lt;br /&gt;
Wer das System nachbauen möchte, kann entweder die TLV320AIC23B-Codecs oder auch beliebige andere Codecs verwenden, solange einer als Master und der andere als Slave arbeitet und beide auf den I2S-Modus mit 64FS und 20-Bit-Wortlänge eingestellt sind. Die Initialisierung dieser Codecs muss dann aber separat vorgenommen werden (wobei man dann wahrscheinlich nicht um einen uC drumrum kommt). Um das System zu testen (Programme und Koeffizienten in den DAP einzuspielen), wird lediglich eine serielle Schnittstelle verwendet. Wer will, kann aber genausogut den SPI-Modus verwenden und den DAP direkt von einem Mikrocontroller aus steuern. Zur Auswahl der verwendeten Schnittstelle (RS232 oder SPI) wird Pin 13 des B1-Connectors benutzt. Liegt dieser Pin auf GND, so wird der FPGA per RS232 gesteuert. Liegt dieser Pin auf 3.3V, so wird der FPGA per SPI gesteuert.&lt;br /&gt;
&lt;br /&gt;
Hier der Schaltplan meines verwendeten Audio-Boards.&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier noch die Pinbelegung des B1-Erweiterungssteckers:&lt;br /&gt;
&lt;br /&gt;
*01 GND&lt;br /&gt;
*02 VCC 5V&lt;br /&gt;
*03 VCC 3.3V&lt;br /&gt;
*04 N.C.&lt;br /&gt;
*05 SPI_CS - Chip Select (von uC nach FPGA)&lt;br /&gt;
*06 N.C.&lt;br /&gt;
*07 SPI_DI - SPI Data In (von uC nach FPGA)&lt;br /&gt;
*08 BCLK - Bit Clock (von Master Codec)&lt;br /&gt;
*09 SPI_CLK - SPI Clock (von uC nach FPGA)&lt;br /&gt;
*10 LRCLK - LR-Clock (von Master Codec)&lt;br /&gt;
*11 SPI_DO - SPI Data Out (von FPGA nach uC)&lt;br /&gt;
*12 SDOUT1 - zum D/A Wandler (Codec) 1&lt;br /&gt;
*13 IF_SEL - Interface Select (GND = RS232; VCC3.3 = SPI)&lt;br /&gt;
*14 SDIN1 - vom A/D Wandler (Codec) 1&lt;br /&gt;
*15 RXD_OUT - RS232 Signal vom MAX232 zum uC&lt;br /&gt;
*16 SDIN2 - vom A/D Wandler (Codec) 2&lt;br /&gt;
*17 TXD_IN - RS232 Signal vom uC zum MAX232&lt;br /&gt;
*18 SDOUT2 - zum D/A Wandler (Codec) 2&lt;br /&gt;
*19 GPO 3 - Chip-Select Codec 2&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 2 - Chip-Select Codec 1&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 1 - SPI-Data out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 0 - SPI-Clock Out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
&lt;br /&gt;
==Nexys Board==&lt;br /&gt;
&lt;br /&gt;
Im SVN Repository (s.u.) gibt es eine Version des DAPs für das Nexys Board.&lt;br /&gt;
Diese ist voll SW-Kompatibel zum alten Spartan 3 Board (allerdings z.Z. nur über RS232 steuerbar). Neu bei der Version ist das das Speicherinterface generisch ausgelegt wurde und ein einfacher SRAM-Controller für das Nexys Board PSDRAM geschrieben wurde. Durch das generische Interface ist es möglich andere Speicherarten anzubinden. Der verwendete Codec ist wie schon im bisherigen Projekt der TLV320AIC23B. Dieser wird via RS232 (6-pin Port A des Nexys Boards) über die GPO Leitungen (6-pin Port D des Nexys Boards) initialisiert. Die eigentlichen Datenleitungen des Codecs liegen an Port B (BCLK, LRCLK, DIN, DOUT).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download des DAP als MCS-File für das Nexys-1000 Board : [[Media:Nexys_dap.zip]]&lt;br /&gt;
&lt;br /&gt;
Diese Version ist voll lauffähig (wurde mit den Demos getestet).&lt;br /&gt;
Die Pin Belegung für die RS232 und den Audio-Codec ist wie folgt :&lt;br /&gt;
&lt;br /&gt;
Header A : RS232 Schnittstelle&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Pin 1 : RxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : TxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V/5V für MAX232/MAX3232)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header B : I2S Schnittstelle für 1 Codec&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : BitClk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : L/R Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : SDIN&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : SDOUT&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V für den Codec)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header D : Codec-Konfiguration via SPI&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : Codec 2 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : Codec 1 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : Codec SPI Data&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : Codec SPI Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DAP mit selbstgelötetem FPGA-Board==&lt;br /&gt;
&lt;br /&gt;
Auf einen Beitrag von Thomas Pototschnig hin bin ich auf sein selbstentworfenes Spartan-3-FPGA-Board (Grafikkarte) aufmerksam geworden. Thomas hat mir die Erlaubnis gegeben dieses Board für den DAP verwenden zu können und die Schaltpläne hier zu veröffentlichen. Nachdem ich von ihm noch einige Vorversionen (nur die Platinen) ergattern konnte und diese erfolgreich aufgebaut (mit Spartan 3-200 und -400) habe, bin ich von diesem Board echt begeistert. Danke nochmals.&lt;br /&gt;
&lt;br /&gt;
[[Bild:FPGA-Board.jpg|thumb|300px|left]]&lt;br /&gt;
&lt;br /&gt;
Hier Schaltplan und Layout. &lt;br /&gt;
&lt;br /&gt;
[[Media:miniFPGA-Board.zip]]&lt;br /&gt;
&lt;br /&gt;
Das Board ist zweiseitig und die &amp;quot;schlimmsten&amp;quot; zu lötenden Bauteile sind lediglich der FPGA (QFP-144) und die beiden RAMs (SOJ36, ekelig). Der Rest ist recht einfach. Auch die Inbetriebnahme des Boards gestaltete sich problemlos.&lt;br /&gt;
&lt;br /&gt;
Den Quellcode für den DAP musste ich etwas ändern und abspecken. Durch den ineffizienten VHDL-Code der MAC-Einheit gestaltete es sich schwierig, den Entwurf synthetisierbar zu machen. Das Synthetisieren auf einem FT256 gestaltete sich einfacher. Hier ist noch dergestalt Handlungsbedarf, dass die MAC-Einheit überarbeitet werden muss. &lt;br /&gt;
Der abgespeckte Entwurf läuft auf dem FPGA-Board mit einem Spartan 3-400 sowie auf einem Spartan 3-200. &lt;br /&gt;
Den Audio-Codec, das FPGA Board, einen AVR und noch etwas IO-Kram habe ich auf eine Lochrasterplatine aufgebaut. Was noch fehlt, sind MIDI- und SD/MMC-Karten-Schnittstellen. Dann hat man eine schöne Plattform für Synthesizer und Effektgeräte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anmerkung==&lt;br /&gt;
&lt;br /&gt;
Da, wie schon gesagt, das Projekt komplett auf meinem &amp;quot;Mist&amp;quot; gewachsen ist, wird es wohl noch eine Weile dauern, bis alles, was den DAP betrifft, hier in diesem Artikel (und auch in einem Dokumentations-PDF) eingearbeitet ist. Ich werde (sofern ich Zeit dazu habe) noch ein Delphi-Programm mit Sourcecode einstellen, welches den DAP richtig nutzbar macht, so dass man dann direkt damit &amp;quot;spielen&amp;quot; kann. Eine umfangreiche und vollständige Dokumentation würde momentan einfach zu viel Zeit in Anspruch nehmen, und ich möchte langsam das Projekt vorstellen, um Anregung, Kritik und Verbesserungsvorschläge ernten zu können. Ich hoffe, weitere Leute zu finden, um diesem Projekt noch mehr Leben und Möglichkeiten einhauchen zu können.&lt;br /&gt;
&lt;br /&gt;
==Fotos==&lt;br /&gt;
&lt;br /&gt;
Ursprüngliche Version:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Gesamt_wo_uc.jpg|thumb|200px|left|Spartan.3-Board und Expansion-Board]]&lt;br /&gt;
[[Bild:Codecs.jpg|thumb|200px|left|Expansion Board]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nexys-Board:&lt;br /&gt;
[[Bild:dap_nexys_v1.jpg|thumb|200px|left|Nexys-Board mit 1 Audio-Codec]]&lt;br /&gt;
[[Bild:Nexys-board-gesamt.jpg|thumb|200px|left|Nexys-Board mit Lochraster-Board und 2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
[[Bild:Nexys-board-codecs-1.jpg|thumb|200px|left|2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufbau von [[Benutzer:Andreas]]:&lt;br /&gt;
[[Bild:Nexys-Audio-DSP-Foto-Andreas.jpg|thumb|600px|left|Nexys + Breadboard + 1 [[Audio Codec Board]]]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Synth-gesamt-klein.jpg|thumb|500px|left|Aufbau des DAPs mit FPGA-Board (entworfen von Thomas Pototschnig) auf Lochraster an AVR, Codec und weiterer IO]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap-Synth-01.jpg|thumb|300px|left|Synth Board. DAP mit AVR,Codec, MIDI-Interface, RS232 (schaltbar) und LCD]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_Ansicht_02.jpg|thumb|300px|left|Synth Board. Komplettansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_klein_3.jpg|thumb|600px|left|Synth Board. Synth-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Oben.jpg|thumb|300px|left|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Unten.jpg|thumb|300px|right|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Träger-und-Mainboard.jpg|thumb|600px|left|Selbstgeroutetes DAP-Board auf Trägerplatine]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Seite.jpg|thumb|300px|left|DAP-Board mit Touch-Display Seitenansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display.jpg|thumb|600px|left|DAP-Board mit Touch-Display]]&lt;br /&gt;
&lt;br /&gt;
Diese Version des DAP hat ein Grafikdisplay incl. Touchpanel. Die Ansteuerung übernimmt der FPGA. Dort ist einer kleiner &amp;quot;Grafik-Prozessor&amp;quot; integriert, der das Update des Displays und das Kopieren der Bitmaps übernimmt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synthesizer Ansicht 1.jpg|thumb|600px|left|]]&lt;br /&gt;
Synth-Board. Komplettansicht in einem Cherry-Tastaturgehäuse (wie dafür gemacht :-)) im Synthesizer-Stil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synth Komplett.jpg|thumb|600px|left|Fertige Version des DAP als Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
Der komplette Synthesizer mit schicker Frontplatte und passendem (oben schon erwähnten :-)) Cherry-Tastatur-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Version 1.5.jpg|thumb|600px|left|Heue Hardwareversion der DAP-Hauptplatine]]&lt;br /&gt;
&lt;br /&gt;
Diese Version beinhaltet folgendes : :-) &lt;br /&gt;
&lt;br /&gt;
 - Xilinx XC3S400&lt;br /&gt;
 - ATmega2561&lt;br /&gt;
&lt;br /&gt;
 - 16 MByte (8Mx16) SDRAM&lt;br /&gt;
 - µSD Card Slot&lt;br /&gt;
 - AT45DB321 DataFlash&lt;br /&gt;
 - 24C512 EEProm&lt;br /&gt;
&lt;br /&gt;
 - TLC320AI23B Audio Codec mit Kopfhörer Ausgang&lt;br /&gt;
 - CS5343 A/D Wandler&lt;br /&gt;
 - CS4344 D/A Wandler&lt;br /&gt;
&lt;br /&gt;
 - MIDI&lt;br /&gt;
 - RS232&lt;br /&gt;
 - etlichen IO-Pins vom AVR und FPGA&lt;br /&gt;
 - 2 separaten Clock-Oszillatoren (nicht bestückt)&lt;br /&gt;
&lt;br /&gt;
... und weiterem Kleinkram (Level-Shifter, LDO, Platform-Flash, usw ... und vielen 100nF-Kondensatoren)&lt;br /&gt;
&lt;br /&gt;
Ideal zum Aufbau einer Audioplattform. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audio-Demos==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein EQ-Demo mit rosa Rauschen. Klingt wie eine Meeresbrandung.&lt;br /&gt;
&lt;br /&gt;
[[Media:eq_demo1.zip]]&lt;br /&gt;
&lt;br /&gt;
Der DAP als Synth. Der DAP wird komplett vom PC aus gesteuert (Hüllkurve, Sequencer und Filterberechnung werden im PC gemacht).&lt;br /&gt;
&lt;br /&gt;
[[Media:synthdemo1.wav.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MC505-Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen von meiner Roland MC505 Groovebox. Es wird einfach nur ein Werkspreset abgespielt und durch den DAP gejagt.&lt;br /&gt;
&lt;br /&gt;
* [[Media:mc505-eq-demo.wav.zip|EQ-Demo]]&lt;br /&gt;
* [[Media:mc505-filter-demo.wav.zip|Filter-Demo (Tiefpass/Hochpass/Notch)]]&lt;br /&gt;
* [[Media:mc505-delay-demo.wav.zip|Delay-Demo (137BPM [657ms &amp;amp; 876 ms]/Chorus)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Synth-Board Audio-Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen vom DAP in Verbindung mit einem AVR, der die Filterkoeffizientenberechnung sowie eine komplette Synthesizersteuerung beinhaltet, also quasi einen Synthesizer aus dem DAP macht (inkl. MIDI-Steuerung).&lt;br /&gt;
&lt;br /&gt;
MIDI-Sequenz und Tiefpassfilter (Filter und Modulation über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-01.mp3]]&lt;br /&gt;
&lt;br /&gt;
Dieselbe MIDI-Sequenz mit Hochpassfilter (Filter und Modulation ebenfalls über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-02.mp3]]&lt;br /&gt;
&lt;br /&gt;
Eine eher Techno-ähnliche Demo, welche die Auflösung des Systems (DAP+AVR+MIDI) ein wenig zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap_syn_demo_03.mp3]]&lt;br /&gt;
&lt;br /&gt;
==Delphi Tools==&lt;br /&gt;
&lt;br /&gt;
Um den DAP nutzbar zu machen benötigt man entweder ein uC Programm oder ein PC Programm. Da das verwenden von PC-Programmen einfacher fürs Spielen und Experimentieren ist, werde ich hier im Laufe der Zeit kleine Demo-Programme aber auch komplette Front-Ends für den DAP reinstellen. Die Delphi-Programme sind allesamt in Turbo-Delphi geschrieben und die dazugehörigen Quellcodes werden ebenfalls im Laufe der Zeit geuploaded. Ich werde allerdings zuerst noch das Feature des Konfigurierens der Codecs vom PC aus einbauen. &lt;br /&gt;
Nachtrag zum Konfigurieren des Codecs : Prinzipiell funktioniert es, allerdings ist das mit häßlichen Nebengeräuschen verbunden, da ich bei jeder Änderung der Lautstärke im Codec, diesen auch Resetten muß, da sonst immer beide Codecs beschrieben werden, was unschön ist. Warum dies so ist kann ich leider nicht sagen, da ich keine Möglichkeit habe die SPI-Leitungen mitzusniffen (bräuchte dafür einen kleinen LA, den ich nicht habe). &lt;br /&gt;
&lt;br /&gt;
* Demo eines 3 Band Stereo Equalizers. (Der Knopf &amp;quot;MoveIt!&amp;quot; bringt Leben ins Demo): [[Media:dap_eq_demo.zip]]&lt;br /&gt;
* Demo eines 4 Kanal Mono Mixers mit Monitor (Vorhör)-Ausgang: [[Media:dap_mix_demo.zip]]&lt;br /&gt;
* Demo eines Synthesizer-Filters: [[Media:dap_filter_demo.zip]]&lt;br /&gt;
* Demo eines 2 Kanal Delays (Der Button &amp;quot;MoveIt!&amp;quot; macht daraus einen Chorus :-))): [[Media:dap_delay_demo.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Quellcodes für das EQ-Demo, das Filter-Demo und das Delay-Demo : [[Media:dap_demos_plus_delphi_source.zip]]&lt;br /&gt;
&lt;br /&gt;
Es folgen noch der Quellcode für den Mischer (hab ich gerade nicht zur Hand) und weitere Demos (ein Synthesizer und eine 4x4 Patchbay mit EQ und was mir sonst noch einfällt. Dann natürlich mit Source-Codes).&lt;br /&gt;
Anhand dieser Beispiele wird auch eine grobe Doku erstellt.&lt;br /&gt;
&lt;br /&gt;
== SVN-Repository ==&lt;br /&gt;
&lt;br /&gt;
 svn co svn://mikrocontroller.net/audiodsp&lt;br /&gt;
&lt;br /&gt;
Ein automatisch aktualisiertes Paket mit den Daten aus dem Repository gibt es unter http://www.mikrocontroller.net/download/audiodsp-snapshot.tar.gz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
&lt;br /&gt;
* 12.07.2007: Es wurde ein generisches Speicherinterfaces implementiert, welches Wartezyklen im DAP erlaubt. Dadurch kann man auf die jeweilgen Speicher des Boards eingehen. Z.Zt. ist nur eine einfaches Speicherschnittstelle für den asynchronen Betrieb des PSDRAM des Nexys-Boards implementiert. Die Schnittstelle ermöglicht den Anschluss eines RAM-Controller, welcher z.&amp;amp;nbsp;B. ein Quasi-Multiport-RAM darstellt. Getestet wurde der Stand mit dem Nexys-1000-Board.&lt;br /&gt;
&lt;br /&gt;
==To do==&lt;br /&gt;
&lt;br /&gt;
* nähere Zukunft&lt;br /&gt;
** Einen Konfigurationsdialog in die Demo-Programme einarbeiten mit denen man mit den Codecs etwas spielen kann (Line-In Level, Mikrofon-Level, Bypass, Head-Phone Volume) tlw. erledigt. Funktioniert aber nicht richtig, und daher noch nicht eingebaut. Quellcodes dazu sind vorhanden.&lt;br /&gt;
** Doku anhand der Demo-Programme erstellen&lt;br /&gt;
** C-Code schnipsel erstellen&lt;br /&gt;
&lt;br /&gt;
* fernere Zukunft&lt;br /&gt;
** Front-End des DAPs machen, mit dem sich DAP-Programme erstellen lassen, der Koeffizienten-, Daten- und Wellenform-Speicher beschrieben und gelesen werden kann, der Mikro-Code editierbar gemacht wird und noch ein paar Sachen mehr machbar sind&lt;br /&gt;
** weitere Module für den Rahmen (HDD-Core, weitere Routing-Möglichkeiten innerhalb der bisherigen Cores SDSP und Util)&lt;br /&gt;
&lt;br /&gt;
==Diskussion==&lt;br /&gt;
* http://www.mikrocontroller.net/topic/65205&lt;br /&gt;
* http://www.mikrocontroller.net/topic/34376&lt;br /&gt;
&lt;br /&gt;
Falls Interesse an einer Sammelbestellung für die Platinen und Bauteile besteht &lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/144288&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]] &lt;br /&gt;
[[Kategorie:Audio]]&lt;br /&gt;
[[Kategorie:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66885</id>
		<title>Audio-DSP mit Spartan 3-FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66885"/>
		<updated>2012-06-14T22:09:41Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* Ziel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [[Benutzer:TheMason]]&lt;br /&gt;
&lt;br /&gt;
==Ziel==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projekts ist es der Aufbau einer FPGA-basierten Plattform, mit der es möglich ist Synthesizer, Effektgeräte, Mischpulte oder gar ein Harddiskrecording-System zu realisieren.&lt;br /&gt;
&lt;br /&gt;
==Feature-Liste==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften des Audio-Prozessors: &lt;br /&gt;
&lt;br /&gt;
* Oszillatoren&lt;br /&gt;
* Biquads (Filter)&lt;br /&gt;
* Addierer, Schalter, Verstärker (Multiplizierer)&lt;br /&gt;
* Delays&lt;br /&gt;
* Steuerung des Audio-Prozessors via SPI oder RS232&lt;br /&gt;
* 4 Mono Ein- und Ausgänge&lt;br /&gt;
* GPO (General Purpose Outputs) zur Konfiguration der Codecs&lt;br /&gt;
&lt;br /&gt;
==Übersicht==&lt;br /&gt;
[[Bild:Overview_wo_uc.jpg|thumb|500px]]&lt;br /&gt;
Basis des Audio-Systems ist das Xilinx Spartan 3-Development Board. An diesem Board werden 2 Audio-Codecs angschlossen von denen einer als Master und der andere als Slave agiert. Optional kann noch ein Mikrocontroller angeschlossen werden welcher den FPGA per SPI steuert. Da dieses Projekt mittlerweile recht umfangreich geworden ist, kann ich hier nur einen kurzen Umriss des Systems geben. Dabei beschränke ich mich auf die grobe Funktionsweise des Audio-Prozessors, erläutere das Interface (welches ich als Basis für weitere Projekte bereits nutze) und gebe einen kleinen Überblick über die Hardware.&lt;br /&gt;
&lt;br /&gt;
Das System kann (sofern man 2 Audio-Codecs, von denen einer als Master, der andere als Slave arbeitet, angeschlossen und konfiguriert hat) direkt genutzt werden, da der DAP per RS232 gesteuert werden kann. Der Audio-Prozessor startet mit einem Stereo-Tiefpass-Filter der sich auf den ersten Codec bezieht,&lt;br /&gt;
sodass man ein erstes Demo hat (selbst wenn es etwas unspektakulär ist)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nachbau==&lt;br /&gt;
&lt;br /&gt;
Wer sich dieses System nachbauen möchte, benötigt zunächst ein FPGA-Board. Mit dem Spartan-3-Board von Digilent gestaltet sich der Nachbau einfach, weil die Programmier-Dateien für den FPGA direkt für dieses Board verwendet werden können. Nutzer anderer Boards (Xilinx) müssten zuerst die UCF-Datei für die Pins ihres jeweiligen Boards anpassen, und dieses Projekt neu synthetisieren (compilieren). Nutzer von Altera-Boards hingegen müssen die BlockRAM-Instanzen auf die Altera-Architektur anpassen (den Inhalt der RAMs dabei nicht vergessen :-). Vielleicht findet sich ja der eine oder andere der den VHDL Code für Altera-FPGAs portiert.&lt;br /&gt;
Der eigentliche wichtige Teil eines Nachbaus ist der Codec-Teil. Dieses System verwendet zwar zwei Codecs, aber es kann auch mit einem gearbeitet werden. Als Codec kommt der TLV320AIC23B von Texas Instruments zum Einsatz. Diesen kann man als kostenloses Muster bei TI direkt bekommen. &lt;br /&gt;
Des weiteren benötigt man noch eine handvoll Bauteile wie Kondensatoren, Widerstände und einen Quarz. (Ein Codec MUSS als Master laufen, sonst hat das System keine Audio-Clocks, da diese nicht vom FPGA generiert werden)&lt;br /&gt;
Die Initialisierung des Codecs wird vom PC aus gemacht. Dazu dienen die 4 GPO-Leitungen auf dem B1-Verbinder. Da der Codec nur &amp;quot;halbes&amp;quot; SPI unterstüzt (man kann nur schreiben, nicht lesen) gestaltet sich die Initialisierung recht einfach.&lt;br /&gt;
Die 4 GPO-Leitungen teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* Chip-Select Codec 2&lt;br /&gt;
* Chip-Select Codec 1&lt;br /&gt;
* SPI Data Out&lt;br /&gt;
* SPI Clock&lt;br /&gt;
&lt;br /&gt;
==Audio-Prozessor (DAP)==&lt;br /&gt;
&lt;br /&gt;
[[bild:Overview dap core.JPG|thumb|500px|right]]&lt;br /&gt;
&lt;br /&gt;
Der FPGA beinhaltet in dem gesamten System einen Quasi-DSP. Quasi-DSP deshalb, da die Struktur im Gegensatz zu einem DSP bzw. Mikrocontroller keine Verzweigungen, Interrupts oder ähnliches zulässt. Der Audio-Prozessor besteht im wesentlichen aus 3 Teilen : einem Rahmen, einem SDSP (Small DSP)-Kern &lt;br /&gt;
sowie einem Utility-Kern. Beide Kerne können theoretisch parallel arbeiten, da jeder Kern einen eigenen Zustandsautomaten und einen eigenen Microcode-Speicher besitzen. Diese Möglichkeit ist allerdings noch nicht implementiert.&lt;br /&gt;
&lt;br /&gt;
Der SDSP-Kern besteht im wesentlichen aus einer MAC-Einheit, einem Speicher für Audiodaten, einem Koeffizienten-Speicher, einem Adressgenerator und mehreren Muxern, sowie dem schon angesprochenen Zustandsautomaten und dem Microcode. Weiterhin ist ein Hidden-Write- (bzw. Shadow Register) Mechanismus integriert,&lt;br /&gt;
welcher ein &amp;quot;knackserfreies&amp;quot; Aktualisieren von Koeffizienten ermöglicht. Alle diese Komponenten werden vom Microcode aus gesteuert (genau wie bei einem Mikrocontroller). Mit diesem Kern ist es möglich, Audiosignale zu bearbeiten. Zu Den Bearbeitungsmöglichkeiten zählen in erster Linie das Verändern der Lautstärke, Mischen, Filtern (Biquad) sowie Laden und Speichern von &lt;br /&gt;
Audiowerten.&lt;br /&gt;
&lt;br /&gt;
Der Utility-Kern besteht aus einem Akkumulator (für DDS), einem Shaper, einem Adressgenerator, einem Wavetable-Speicher, einem Zufallszahlengenerator, einigen Muxern, (einem Adressgenerator für SRAM, einem SRAM-Controller; diese sind allerdings nur nutzbar, wenn man das ganze mit dem ISE 6.2 synthetisiert) &lt;br /&gt;
und dem schon angesprochenen Zustandsautomaten und dem Microcode. Der Microcode steuert (genau wie beim SDSP-Kern) dabei die einzelnen Komponenten des Utility-Kerns. Dieser Kern ist für das Erzeugen von Audiosignalen zuständig, und erlaubt ein Audiosignal zu verzögern, sofern man die ISE-Version 6.2 verwendet (später dazu mehr). Als Wellenformen stehen Sägezahn, Rechteck (mit veränderbarer Pulsbreite), Rauschen sowie benutzderdefinierbare Wellenformen (Wavetable) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Der Rahmen besteht aus einem Zustandsautomaten, einem Programmspeicher, einigen Muxern, sowie einem doppelten I2S-Sender/Empfänger (für 2 Stereo Ein- und Ausgänge). In den Rahmen werden die beiden Kerne &amp;quot;eingehängt&amp;quot;. Die Kerne werden vom Programmspeicher aus mit Daten versorgt, und vom Zustandsautomaten angesteuert. Der Programmspeicher (PMEM) ist als 512x32 Bit organisiert. Das heißt, dass ein Befehl im Programmspeicher 32 Bit an Informationen enthält und der Audioprozessor max. 512 Befehle umfassen kann.&lt;br /&gt;
&lt;br /&gt;
===SDSP-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:SDSP-Struct.jpg|thumb|300px|left|Struktur des SDSP-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Der eigentliche Kern des DAPs ist die MAC-Einheit. Mit ihr werden die grundlegenden Operationen Multiplikation und Addition durchgeführt. Es ist eine 32x32-Bit-Einheit. &lt;br /&gt;
Die Funktionsweise des Kerns ist eigentlich recht einfach. &lt;br /&gt;
Die MAC-Einheit hat 2 Eingänge. Einer dieser Eingänge kann ein Audiosignal, ein Wert aus dem Audiospeicher (AMEM-BlockRAM) oder ein zuvor berechnetes Ergebnis sein. Der andere Eingang kann ein Koeffizient aus dem CMEM-BlockRAM oder eine Konstante (1.000, 0.000 oder -1.000) sein.&lt;br /&gt;
Der Ausgang (32-Bit, hart geclippt) geht auf das AMEM-BlockRAM und zum Ausgangs-Clipping. Das Ausgangsclipping schneidet das Audiosignal auf 24-Bit zurecht.&lt;br /&gt;
Die Adressen für die Speicher (AMEM und CMEM) werden im Addressgenerator erzeugt. Dieser wird von außen mit einer 8-Bit-Basis-Adresse gespeist und erzeugt einen Offset zu den Eingangsadressen. Er besitzt 2 setzbare Zähler und einige Multiplexer.&lt;br /&gt;
Alle Steuersignale der Komponenten von einem weiteren aus BlockRAM (MMEM) versorgt. Weiterhin wird von außen eine Startadresse vorgegeben. Dadurch lassen sich quasi Opcodes mit von außen vorgegeben Parametern (Adressen) aufrufen.&lt;br /&gt;
Das MMEM-BlockRAM wird nun einfach nur linear ausgelesen bis ein Stopbit gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Util-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Util-Core.jpg|thumb|300px|left|Struktur des Utility-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Beschreibung folgt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opcodes des DAP===&lt;br /&gt;
&lt;br /&gt;
Diese 32 Bit eines Befehls teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* 4 Bit = Opcode (für SDSP und Utility Kern gleich)&lt;br /&gt;
* 2 Bit = noch leer&lt;br /&gt;
* 1 Bit = Core Select (SDSP oder Utility)&lt;br /&gt;
* 1 Bit = Ende des Programms&lt;br /&gt;
* 4 Bit = Eingangsrouting (Kanal 1 - 4, Ergebnis SDSP-Kern, Ergebnis Utility-Kern)&lt;br /&gt;
* 4 Bit = Ausgangsrouting (SDSP-Ausgang auf Kanal 1-4, Utility-Ausgang auf Kanal 1-4)&lt;br /&gt;
* 8 Bit = Adresse 1 (bei SDSP für Audio-Memory, bei Utility-Kern für Datenspeicher)&lt;br /&gt;
* 8 Bit = Adresse 2 (bei SDSP für Koeffizientenspeicher, bei Utility-Kern unbenutzt)&lt;br /&gt;
&lt;br /&gt;
Das Eingangsrouting bestimmt, mit welchem Signal der gewählte Kern arbeiten soll. Dies können die Eingänge 1-4 aber auch ein vorher berechnetes Ergebnis des SDSP- bzw. Utility-Kerns sein. Das Ausgangsrouting bestimmt, von welchem Kern das Signal auf welchen Ausgang geroutet wird.&lt;br /&gt;
&lt;br /&gt;
Die Opcodes des DAPs sind:&lt;br /&gt;
&lt;br /&gt;
SDSP-Kern:&lt;br /&gt;
* Biquad rechnen&lt;br /&gt;
* Audiowert speichern&lt;br /&gt;
* Audiowert laden&lt;br /&gt;
* Move eines Wertes im Audiospeicher&lt;br /&gt;
* Summe rücksetzen&lt;br /&gt;
* Eingang zu Summe addieren&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe addieren&lt;br /&gt;
* Eingang zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Lautstärke &lt;br /&gt;
&lt;br /&gt;
Utility-Kern:&lt;br /&gt;
* Oszillator (DDS-Teil)&lt;br /&gt;
* Waveshaper&lt;br /&gt;
* Verzögerung&lt;br /&gt;
&lt;br /&gt;
Der Ablauf eines Audio-Programms ist folgender:&lt;br /&gt;
&lt;br /&gt;
Sobald ein neues Sample anliegt, wird die Abarbeitung des Programms von Adresse 0x0000 an im PMEM angestoßen. Es wird dabei jeweils ein Befehl geladen und Daten wie Opcode und Adressen liegen dabei an beide Kernen gleichermaßen an. Ist das Programm-Ende-Bit nicht gesetzt, so wird der jeweilige Kern (mit dem im Opcode angegeben Routing) angesteuert. Legt der betreffende Kern sein Ready-Signal auf 1, so wird der nächste Befehl abgearbeitet. Dieses Verhalten (Laden und Verteilen von Opcode-Daten sowie die Ablaufsteuerung, also das Ansteuern des Programms, Ansteuern der einzelnen Kerne, warten auf dessen Abarbeitung und das Programmende) wird vom Rahmen übernommen.&lt;br /&gt;
&lt;br /&gt;
===Speicherorganisation===&lt;br /&gt;
&lt;br /&gt;
Alle Speicher die vom DAP angesprochen werden, haben eine Wortbreite von 32 Bit, der Zugriff erfolgt aber ausschließlich über eine Breite von 8 Bit (Interface).&lt;br /&gt;
&lt;br /&gt;
DAP&lt;br /&gt;
* Programmspeicher 	(PMEM)   0x0000 - 0x07ff&lt;br /&gt;
&lt;br /&gt;
SDSP&lt;br /&gt;
* Audiospeicher   	(AMEM)   von außen nicht zugänglich&lt;br /&gt;
* Koeffizientenspeicher 	(CMEM)   0x2000 - 0x2023  (man &amp;quot;sieht&amp;quot; nur den Hidden Write -&amp;gt; später mehr dazu)&lt;br /&gt;
* Microcodespeicher      (MMEM)   0x4000 - 0x47ff&lt;br /&gt;
&lt;br /&gt;
Utility-Core&lt;br /&gt;
* Datenspeicher          (DMEM)   0x6000 - 0x67ff&lt;br /&gt;
* Wavetable-Speicher      (WMEM)   0x8000 - 0x87ff&lt;br /&gt;
* Microcodespeicher      (UMEM)   0xa000 - 0xa7ff&lt;br /&gt;
&lt;br /&gt;
===Hidden-Write===&lt;br /&gt;
Um bei Änderung der Koeffizienten Knackser zu vermeiden (die dadurch entstehen das der Koeffizient nur teilweise [durch 8-Bit-Zugriffe] geändert wird, währenddessen aber Audio trotzdem noch &amp;quot;weiterläuft&amp;quot; und mit &amp;quot;falschen&amp;quot; Zwischenwerten gerechnet wird), ist ein Mechanismus implementiert, der die zu ändernden Koeffizienten im Hintergund in den Speicher schreibt. Um diesen Mechanismus zu nutzen, müssen zuerst die Koeffizienten in interne Register&lt;br /&gt;
geschrieben werden. Die Register (es sind 8 32-Bit-Register) liegen im Speicherbereich 0x2000 bis 0x201f. Die Speicherstelle 0x2020 gibt die Startadresse innerhalb des Koeffizientenspeichers an. Diese Adresse ist nur 8 Bit breit. Die Speicherstelle 0x2021 gibt an, wieviele der 8 Register übertragen werden sollen. Die Speicherstelle 0x2022 löst den Kopiervorgang aus. Hier reicht es, ein Dummy-Byte zu schreiben. Um den Kopiervorgang zu beenden (MUSS GEMACHT WERDEN!, sonst können keine weiteren Koeffizientenupdates gemacht werden), schreibt man an Speicherstelle 0x2023 ebenfalls ein Dummy-Byte.&lt;br /&gt;
&lt;br /&gt;
===I/O Register===&lt;br /&gt;
&lt;br /&gt;
Es gibt noch einen 8-Bit breiten Adressbereich innerhalb des DAPs, mit dem der I2S-Teil stummgeschaltet werden kann. Weiterhin hat man die Möglichkeit, die Anzahl der Systemtakte pro Sample und die Anzahl der aktiven Systemtakte (also die Zeit die der Audioprozessor beschäftigt ist) zu ermitteln. Dadurch lässt sich eine Auslastungsanzeige des DAPs realisieren.&lt;br /&gt;
&lt;br /&gt;
===Interface===&lt;br /&gt;
&lt;br /&gt;
Um von außen nun ein Programm (bzw. Koeffizienten und Daten) zu laden, ist eine einfach zu handhabende und erweiterbare Schnittstelle implementiert. Die Schnittstelle kann per RS232 (fest eingestellt auf 115,2kBaud) oder per SPI (wird hardwaremäßig eingestellt) angesteuert werden. Die Schnittstelle in ihrer Gesamtheit ist schichtweise aufgebaut und beginnt mit einem Daten-Dispatcher. Dieser Daten-Dispatcher entscheidet (nachdem dieser selektiert wurde) mit dem ersten Byte, an welches angeschlossene Gerät der weitere Datenstrom geleitet wird.&lt;br /&gt;
&lt;br /&gt;
Als angeschlossene Geräte sind im aktuellen Entwurf ein Gerät namens &amp;quot;StdIO&amp;quot; und der Audioprozessor verfügbar.&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;StdIO&amp;quot;-Gerät steuert die 7-Segment-Anzeige (16-Bit-Hexadezimalanzeige oder 32-Bit-Einzelsegmentanzeige) sowie die 8 Leuchtdioden, und erlaubt es, die 3 Drucktaster sowie die 8 Schiebeschalter auszulesen.&lt;br /&gt;
&lt;br /&gt;
Der Audioprozessor besteht (schnittstellenseitig) nur aus einer Speicherzugriffsschnittstelle. Diese Schnittstelle entscheidet mit dem ersten Byte (sobald es selektiert wurde), ob in den Speicher geschrieben, von diesem gelesen, ein I/O-Schreib- oder -Lesezugriff erfolgen soll.&lt;br /&gt;
Die folgenden 2 Bytes (im Falle eines I/O-Zugriffs nur 1 Byte) bestimmen die Adresse und damit den Speicherbereich des Audioprozessors, auf den zugegriffen werden soll. Die Speicherschnittstelle besitzt einen Autoinkrementierer,&lt;br /&gt;
mit dem fortlaufende Bytes einfach hintereinander geschrieben werden können, ohne dass jedes mal wieder der FPGA, das Gerät und die neue Adresse neu geschrieben werden müssen, was den Zugriff erheblich beschleunigt.&lt;br /&gt;
&lt;br /&gt;
Ursprünglich basierte das System auf einem SPI-Interface. Dabei wurde die Chip-Select-Leitung als &amp;quot;globaler&amp;quot; Interface-Reset betrachtet, d.h. war die Leitung auf High, war der FPGA deselektiert und und alle Interface-Zustandsautomaten wurden im Reset gehalten. Erst mit dem Setzen dieser Leitung wurde der FPGA angesprochen. (erstes Byte -&amp;gt; Daten-Dispatcher, folgende Bytes gehen an das ausgewählte Gerät). Weiterhin hat SPI die Eigenschaft, dass mit jedem gesendeten Byte auch eines empfangen wurde. Der Umstand, dass RS232 weder eine Chip-Select Leitung benötigt noch eine synchrone Übertragung erzwingt, führt zu dem Umstand, dass man bei Nutzung von RS232 einige Befehle zusätzlich benötigt. Diese Befehle werden durch das Zeichen 0x1b (ESC) eingeleitet. Soll statt der &amp;quot;Spezialfunktion&amp;quot; das Byte 0x1b übertragen werden, so wird dieses einfach erneut gesendet. Soll die Chip-Select-Leitung gesetzt bzw. gelöscht werden, so wird die Sequenz 0x1b 0x00 (Selektieren) bzw.&lt;br /&gt;
0x1b 0x01 (Deselektieren) gesendet. Soll ein zuvor im Ausgangsregister gesetztes Byte gesendet werden, so muss die Sequenz 0x1b 0x02 gesendet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
0x121b auf dem 7-Segment-Display per RS232 anzeigen:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x00      (Hi-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x12      (Wert 12)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x01      (Lo-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x1b 0x1b (Wert 1b -&amp;gt; zu beachten: wenn der Wert 0x1b übertragen werden soll, muss dieser doppelt gesendet werden !!)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Beispiel, um in den Programmspeicher des Audioprozessors an Adresse 0x0010 das Langwort 0x12233445 zu schreiben:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf1      (DAP selektieren)&lt;br /&gt;
*- 0x00      (Speicher schreiben)&lt;br /&gt;
*- 0x00      &lt;br /&gt;
*- 0x10      (Adresse 0x0010 -&amp;gt; PMEM-Adresse 0x010)&lt;br /&gt;
*- 0x12	    (Adresse 0x0010 -&amp;gt; 0x12)	&lt;br /&gt;
*- 0x23	    (Adresse 0x0011 -&amp;gt; 0x23, autoincrement)&lt;br /&gt;
*- 0x34      (Adresse 0x0012 -&amp;gt; 0x34, autoincrement)&lt;br /&gt;
*- 0x45      (Adresse 0x0013 -&amp;gt; 0x45, autoincrement)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Auslesen der 8 Schalter:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x04      (Schalter auslesen)&lt;br /&gt;
*- 0x00	    (dummy byte -&amp;gt; überträgt Schalterstellung in Ausgaberegister)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man die 8 Schalterstellungen binärcodiert)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Der Datendispatcher (welcher mit dem ersten Byte nach dem Selektieren des FPGAs [0x1b 0x00] angesprochen wird) hat weiterhin einige nützliche Funktionen, die in ihrer Gesamtheit allerdings noch nicht ausführlich getestet wurden. Darunter sind Funktionen, mit denen Informationen über die an den Ports des Daten-Dispatchers angeschlossenen Geräte zu ermitteln. Diese Funktion kann dazu genutzt werden, um zu ermitten, welche Geräte im FPGA implementiert sind und an welchen Ports welche Geräte angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
Anzahl der Ports des Daten-Dispatchers liefern:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xed      (Anzahl Ports lesen)&lt;br /&gt;
*- 0x00      (dummy byte -&amp;gt; überträgt Inhalt des Ausgaberegisters)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man 0x22)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
===DAP-Modul-Schnipsel===&lt;br /&gt;
&lt;br /&gt;
Um mal &amp;quot;eben&amp;quot; mit dem DAP zu spielen, ein paar Schnipsel die sich recht leicht zu kompletten Funktionsblöcken zusammenschließen lassen.&lt;br /&gt;
Es werden hier nur die RS232-Sequenzen mit einer kurzen Erklärung aufgelistet.&lt;br /&gt;
&lt;br /&gt;
*Dual Mono Biquad&lt;br /&gt;
&lt;br /&gt;
*ESC 0x00 - FPGA selektieren&lt;br /&gt;
*0xF1     - DAP auswählen&lt;br /&gt;
*0x00 0x00 0x00 - Memory Write (Adresse 0x0000 -&amp;gt; Program Memory)&lt;br /&gt;
*0x10 0x00 0x00 0x08 - Biquad mit Kanal 1 (0) rechnen (AMEM = 0x00;CMEM = 0x08) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x10 0xf0 0x08 0x10 - Biquad mit vorherigem Ergebnis (0xf) rechnen (AMEM = 0x08; CMEM = 0x10) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x01 0x00 0x00 0x00 - Audioprogramm Ende (wichtig !!!)&lt;br /&gt;
*ESC 0x01 - DAP &amp;amp; FPGA deselektieren&lt;br /&gt;
&lt;br /&gt;
Erklärung :&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Opcodes 0x100008 deutet an, dass ein Biquad durchgerechnet werden soll. Das Eingangsregister 0 bedeutet, dass Kanal 1 des 1. Codecs verwendet wird. Das Ausgangsregister, welches nach Fertigstellung des Ergebnisses benutzt werden soll, ist 0 (-&amp;gt; Kanal 1 des 1. Codecs). Der Teil 0x00 0x08 bedeutet hierbei, dass die Biquad-Koeffizienten im CMEM ab Adresse 0x08 stehen. Die Audio-Zwischenwerte werden in den Audiospeicher AMEM ab Adresse 0x00 gelegt.&lt;br /&gt;
Der zweite Opcode (0x10f00810) rechnet ebenfalls ein Biquad durch. Nur dass hier statt Kanal 1 des Codecs das voher vom SDSP berechnete Ergebnis verwendet werden soll (Kanal 0xf, wenn man so will). Ausgangsregister ist auch hier wieder Kanal 1. Da dieser Biquad unabhängig vom ersten (d.h. mit anderen Parametern) gerechnet werden soll, sind hier logischerweise auch andere Adressen für AMEM (0x08) und CMEM (0x10) angegeben. Die CMEM-Adresse ist dabei etwas unkritischer, da es ja durchaus sein kann, dass ein Audiosignal zweimal mit den selben Biquad-Werten gerechnet werden soll, bzw. unterschiedliche Kanäle mit den selben Biquad-Werten, z.b. bei einem Stereo-Equalizer. Kritischer ist allerdings die Verwendung der AMEM-Adresse. Diese sollte für jede Operation (sofern AMEM denn verwendet wird) unterschiedlich sein, vor allem bei der Berechnung von Biquads. Dies hat den Grund, dass bei Operationen, die dieselben AMEM Adressen haben, die vorher berechneten Werte überschrieben werden. Dies ist bei Biquads gaanz böse (kann u.U. SEHR laut werden), und vom Ergebnis her nicht vorhersagbar.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
[[bild:Fpga_ext_board_schematic_no_uc.JPG|thumb|500px]]&lt;br /&gt;
&lt;br /&gt;
Wie Eingangs erwähnt, benötigt das System eine (bzw. zwei) Audio-Codecs. Im aktuellen Schaltplan wird auf einen Mikroprozessor verzichtet. Dieser diente im System primär zu Initialisierung der Codecs. Dieser Vorgang kann nun vom PC aus gesteuert werden, da in der neuen ISE-6.2-Version 4 Leitungen herausgeführt wurden, welche per RS232 gesetzt und gelöscht werden. &lt;br /&gt;
Wer das System nachbauen möchte, kann entweder die TLV320AIC23B-Codecs oder auch beliebige andere Codecs verwenden, solange einer als Master und der andere als Slave arbeitet und beide auf den I2S-Modus mit 64FS und 20-Bit-Wortlänge eingestellt sind. Die Initialisierung dieser Codecs muss dann aber separat vorgenommen werden (wobei man dann wahrscheinlich nicht um einen uC drumrum kommt). Um das System zu testen (Programme und Koeffizienten in den DAP einzuspielen), wird lediglich eine serielle Schnittstelle verwendet. Wer will, kann aber genausogut den SPI-Modus verwenden und den DAP direkt von einem Mikrocontroller aus steuern. Zur Auswahl der verwendeten Schnittstelle (RS232 oder SPI) wird Pin 13 des B1-Connectors benutzt. Liegt dieser Pin auf GND, so wird der FPGA per RS232 gesteuert. Liegt dieser Pin auf 3.3V, so wird der FPGA per SPI gesteuert.&lt;br /&gt;
&lt;br /&gt;
Hier der Schaltplan meines verwendeten Audio-Boards.&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier noch die Pinbelegung des B1-Erweiterungssteckers:&lt;br /&gt;
&lt;br /&gt;
*01 GND&lt;br /&gt;
*02 VCC 5V&lt;br /&gt;
*03 VCC 3.3V&lt;br /&gt;
*04 N.C.&lt;br /&gt;
*05 SPI_CS - Chip Select (von uC nach FPGA)&lt;br /&gt;
*06 N.C.&lt;br /&gt;
*07 SPI_DI - SPI Data In (von uC nach FPGA)&lt;br /&gt;
*08 BCLK - Bit Clock (von Master Codec)&lt;br /&gt;
*09 SPI_CLK - SPI Clock (von uC nach FPGA)&lt;br /&gt;
*10 LRCLK - LR-Clock (von Master Codec)&lt;br /&gt;
*11 SPI_DO - SPI Data Out (von FPGA nach uC)&lt;br /&gt;
*12 SDOUT1 - zum D/A Wandler (Codec) 1&lt;br /&gt;
*13 IF_SEL - Interface Select (GND = RS232; VCC3.3 = SPI)&lt;br /&gt;
*14 SDIN1 - vom A/D Wandler (Codec) 1&lt;br /&gt;
*15 RXD_OUT - RS232 Signal vom MAX232 zum uC&lt;br /&gt;
*16 SDIN2 - vom A/D Wandler (Codec) 2&lt;br /&gt;
*17 TXD_IN - RS232 Signal vom uC zum MAX232&lt;br /&gt;
*18 SDOUT2 - zum D/A Wandler (Codec) 2&lt;br /&gt;
*19 GPO 3 - Chip-Select Codec 2&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 2 - Chip-Select Codec 1&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 1 - SPI-Data out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 0 - SPI-Clock Out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
&lt;br /&gt;
==Nexys Board==&lt;br /&gt;
&lt;br /&gt;
Im SVN Repository (s.u.) gibt es eine Version des DAPs für das Nexys Board.&lt;br /&gt;
Diese ist voll SW-Kompatibel zum alten Spartan 3 Board (allerdings z.Z. nur über RS232 steuerbar). Neu bei der Version ist das das Speicherinterface generisch ausgelegt wurde und ein einfacher SRAM-Controller für das Nexys Board PSDRAM geschrieben wurde. Durch das generische Interface ist es möglich andere Speicherarten anzubinden. Der verwendete Codec ist wie schon im bisherigen Projekt der TLV320AIC23B. Dieser wird via RS232 (6-pin Port A des Nexys Boards) über die GPO Leitungen (6-pin Port D des Nexys Boards) initialisiert. Die eigentlichen Datenleitungen des Codecs liegen an Port B (BCLK, LRCLK, DIN, DOUT).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download des DAP als MCS-File für das Nexys-1000 Board : [[Media:Nexys_dap.zip]]&lt;br /&gt;
&lt;br /&gt;
Diese Version ist voll lauffähig (wurde mit den Demos getestet).&lt;br /&gt;
Die Pin Belegung für die RS232 und den Audio-Codec ist wie folgt :&lt;br /&gt;
&lt;br /&gt;
Header A : RS232 Schnittstelle&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Pin 1 : RxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : TxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V/5V für MAX232/MAX3232)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header B : I2S Schnittstelle für 1 Codec&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : BitClk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : L/R Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : SDIN&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : SDOUT&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V für den Codec)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header D : Codec-Konfiguration via SPI&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : Codec 2 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : Codec 1 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : Codec SPI Data&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : Codec SPI Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DAP mit selbstgelötetem FPGA-Board==&lt;br /&gt;
&lt;br /&gt;
Auf einen Beitrag von Thomas Pototschnig hin bin ich auf sein selbstentworfenes Spartan-3-FPGA-Board (Grafikkarte) aufmerksam geworden. Thomas hat mir die Erlaubnis gegeben dieses Board für den DAP verwenden zu können und die Schaltpläne hier zu veröffentlichen. Nachdem ich von ihm noch einige Vorversionen (nur die Platinen) ergattern konnte und diese erfolgreich aufgebaut (mit Spartan 3-200 und -400) habe, bin ich von diesem Board echt begeistert. Danke nochmals.&lt;br /&gt;
&lt;br /&gt;
[[Bild:FPGA-Board.jpg|thumb|300px|left]]&lt;br /&gt;
&lt;br /&gt;
Hier Schaltplan und Layout. &lt;br /&gt;
&lt;br /&gt;
[[Media:miniFPGA-Board.zip]]&lt;br /&gt;
&lt;br /&gt;
Das Board ist zweiseitig und die &amp;quot;schlimmsten&amp;quot; zu lötenden Bauteile sind lediglich der FPGA (QFP-144) und die beiden RAMs (SOJ36, ekelig). Der Rest ist recht einfach. Auch die Inbetriebnahme des Boards gestaltete sich problemlos.&lt;br /&gt;
&lt;br /&gt;
Den Quellcode für den DAP musste ich etwas ändern und abspecken. Durch den ineffizienten VHDL-Code der MAC-Einheit gestaltete es sich schwierig, den Entwurf synthetisierbar zu machen. Das Synthetisieren auf einem FT256 gestaltete sich einfacher. Hier ist noch dergestalt Handlungsbedarf, dass die MAC-Einheit überarbeitet werden muss. &lt;br /&gt;
Der abgespeckte Entwurf läuft auf dem FPGA-Board mit einem Spartan 3-400 sowie auf einem Spartan 3-200. &lt;br /&gt;
Den Audio-Codec, das FPGA Board, einen AVR und noch etwas IO-Kram habe ich auf eine Lochrasterplatine aufgebaut. Was noch fehlt, sind MIDI- und SD/MMC-Karten-Schnittstellen. Dann hat man eine schöne Plattform für Synthesizer und Effektgeräte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anmerkung==&lt;br /&gt;
&lt;br /&gt;
Da, wie schon gesagt, das Projekt komplett auf meinem &amp;quot;Mist&amp;quot; gewachsen ist, wird es wohl noch eine Weile dauern, bis alles, was den DAP betrifft, hier in diesem Artikel (und auch in einem Dokumentations-PDF) eingearbeitet ist. Ich werde (sofern ich Zeit dazu habe) noch ein Delphi-Programm mit Sourcecode einstellen, welches den DAP richtig nutzbar macht, so dass man dann direkt damit &amp;quot;spielen&amp;quot; kann. Eine umfangreiche und vollständige Dokumentation würde momentan einfach zu viel Zeit in Anspruch nehmen, und ich möchte langsam das Projekt vorstellen, um Anregung, Kritik und Verbesserungsvorschläge ernten zu können. Ich hoffe, weitere Leute zu finden, um diesem Projekt noch mehr Leben und Möglichkeiten einhauchen zu können.&lt;br /&gt;
&lt;br /&gt;
==Fotos==&lt;br /&gt;
&lt;br /&gt;
Ursprüngliche Version:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Gesamt_wo_uc.jpg|thumb|200px|left|Spartan.3-Board und Expansion-Board]]&lt;br /&gt;
[[Bild:Codecs.jpg|thumb|200px|left|Expansion Board]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nexys-Board:&lt;br /&gt;
[[Bild:dap_nexys_v1.jpg|thumb|200px|left|Nexys-Board mit 1 Audio-Codec]]&lt;br /&gt;
[[Bild:Nexys-board-gesamt.jpg|thumb|200px|left|Nexys-Board mit Lochraster-Board und 2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
[[Bild:Nexys-board-codecs-1.jpg|thumb|200px|left|2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufbau von [[Benutzer:Andreas]]:&lt;br /&gt;
[[Bild:Nexys-Audio-DSP-Foto-Andreas.jpg|thumb|600px|left|Nexys + Breadboard + 1 [[Audio Codec Board]]]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Synth-gesamt-klein.jpg|thumb|500px|left|Aufbau des DAPs mit FPGA-Board (entworfen von Thomas Pototschnig) auf Lochraster an AVR, Codec und weiterer IO]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap-Synth-01.jpg|thumb|300px|left|Synth Board. DAP mit AVR,Codec, MIDI-Interface, RS232 (schaltbar) und LCD]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_Ansicht_02.jpg|thumb|300px|left|Synth Board. Komplettansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_klein_3.jpg|thumb|600px|left|Synth Board. Synth-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Oben.jpg|thumb|300px|left|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Unten.jpg|thumb|300px|right|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Träger-und-Mainboard.jpg|thumb|600px|left|Selbstgeroutetes DAP-Board auf Trägerplatine]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Seite.jpg|thumb|300px|left|DAP-Board mit Touch-Display Seitenansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display.jpg|thumb|600px|left|DAP-Board mit Touch-Display]]&lt;br /&gt;
&lt;br /&gt;
Diese Version des DAP hat ein Grafikdisplay incl. Touchpanel. Die Ansteuerung übernimmt der FPGA. Dort ist einer kleiner &amp;quot;Grafik-Prozessor&amp;quot; integriert, der das Update des Displays und das Kopieren der Bitmaps übernimmt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synthesizer Ansicht 1.jpg|thumb|600px|left|]]&lt;br /&gt;
Synth-Board. Komplettansicht in einem Cherry-Tastaturgehäuse (wie dafür gemacht :-)) im Synthesizer-Stil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synth Komplett.jpg|thumb|600px|left|Fertige Version des DAP als Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
Der komplette Synthesizer mit schicker Frontplatte und passendem (oben schon erwähnten :-)) Cherry-Tastatur-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Version 1.5.jpg|thumb|600px|left|Heue Hardwareversion der DAP-Hauptplatine]]&lt;br /&gt;
&lt;br /&gt;
Diese Version beinhaltet folgendes : :-) &lt;br /&gt;
&lt;br /&gt;
 - Xilinx XC3S400&lt;br /&gt;
 - ATmega2561&lt;br /&gt;
&lt;br /&gt;
 - 16 MByte (8Mx16) SDRAM&lt;br /&gt;
 - µSD Card Slot&lt;br /&gt;
 - AT45DB321 DataFlash&lt;br /&gt;
 - 24C512 EEProm&lt;br /&gt;
&lt;br /&gt;
 - TLC320AI23B Audio Codec mit Kopfhörer Ausgang&lt;br /&gt;
 - CS5343 A/D Wandler&lt;br /&gt;
 - CS4344 D/A Wandler&lt;br /&gt;
&lt;br /&gt;
 - MIDI&lt;br /&gt;
 - RS232&lt;br /&gt;
 - etlichen IO-Pins vom AVR und FPGA&lt;br /&gt;
 - 2 separaten Clock-Oszillatoren (nicht bestückt)&lt;br /&gt;
&lt;br /&gt;
... und weiterem Kleinkram (Level-Shifter, LDO, Platform-Flash, usw ... und vielen 100nF-Kondensatoren)&lt;br /&gt;
&lt;br /&gt;
Ideal zum Aufbau einer Audioplattform. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audio-Demos==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein EQ-Demo mit rosa Rauschen. Klingt wie eine Meeresbrandung.&lt;br /&gt;
&lt;br /&gt;
[[Media:eq_demo1.zip]]&lt;br /&gt;
&lt;br /&gt;
Der DAP als Synth. Der DAP wird komplett vom PC aus gesteuert (Hüllkurve, Sequencer und Filterberechnung werden im PC gemacht).&lt;br /&gt;
&lt;br /&gt;
[[Media:synthdemo1.wav.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MC505-Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen von meiner Roland MC505 Groovebox. Es wird einfach nur ein Werkspreset abgespielt und durch den DAP gejagt.&lt;br /&gt;
&lt;br /&gt;
* [[Media:mc505-eq-demo.wav.zip|EQ-Demo]]&lt;br /&gt;
* [[Media:mc505-filter-demo.wav.zip|Filter-Demo (Tiefpass/Hochpass/Notch)]]&lt;br /&gt;
* [[Media:mc505-delay-demo.wav.zip|Delay-Demo (137BPM [657ms &amp;amp; 876 ms]/Chorus)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Synth-Board Audio-Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen vom DAP in Verbindung mit einem AVR, der die Filterkoeffizientenberechnung sowie eine komplette Synthesizersteuerung beinhaltet, also quasi einen Synthesizer aus dem DAP macht (inkl. MIDI-Steuerung).&lt;br /&gt;
&lt;br /&gt;
MIDI-Sequenz und Tiefpassfilter (Filter und Modulation über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-01.mp3]]&lt;br /&gt;
&lt;br /&gt;
Dieselbe MIDI-Sequenz mit Hochpassfilter (Filter und Modulation ebenfalls über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-02.mp3]]&lt;br /&gt;
&lt;br /&gt;
Eine eher Techno-ähnliche Demo, welche die Auflösung des Systems (DAP+AVR+MIDI) ein wenig zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap_syn_demo_03.mp3]]&lt;br /&gt;
&lt;br /&gt;
==Delphi Tools==&lt;br /&gt;
&lt;br /&gt;
Um den DAP nutzbar zu machen benötigt man entweder ein uC Programm oder ein PC Programm. Da das verwenden von PC-Programmen einfacher fürs Spielen und Experimentieren ist, werde ich hier im Laufe der Zeit kleine Demo-Programme aber auch komplette Front-Ends für den DAP reinstellen. Die Delphi-Programme sind allesamt in Turbo-Delphi geschrieben und die dazugehörigen Quellcodes werden ebenfalls im Laufe der Zeit geuploaded. Ich werde allerdings zuerst noch das Feature des Konfigurierens der Codecs vom PC aus einbauen. &lt;br /&gt;
Nachtrag zum Konfigurieren des Codecs : Prinzipiell funktioniert es, allerdings ist das mit häßlichen Nebengeräuschen verbunden, da ich bei jeder Änderung der Lautstärke im Codec, diesen auch Resetten muß, da sonst immer beide Codecs beschrieben werden, was unschön ist. Warum dies so ist kann ich leider nicht sagen, da ich keine Möglichkeit habe die SPI-Leitungen mitzusniffen (bräuchte dafür einen kleinen LA, den ich nicht habe). &lt;br /&gt;
&lt;br /&gt;
* Demo eines 3 Band Stereo Equalizers. (Der Knopf &amp;quot;MoveIt!&amp;quot; bringt Leben ins Demo): [[Media:dap_eq_demo.zip]]&lt;br /&gt;
* Demo eines 4 Kanal Mono Mixers mit Monitor (Vorhör)-Ausgang: [[Media:dap_mix_demo.zip]]&lt;br /&gt;
* Demo eines Synthesizer-Filters: [[Media:dap_filter_demo.zip]]&lt;br /&gt;
* Demo eines 2 Kanal Delays (Der Button &amp;quot;MoveIt!&amp;quot; macht daraus einen Chorus :-))): [[Media:dap_delay_demo.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Quellcodes für das EQ-Demo, das Filter-Demo und das Delay-Demo : [[Media:dap_demos_plus_delphi_source.zip]]&lt;br /&gt;
&lt;br /&gt;
Es folgen noch der Quellcode für den Mischer (hab ich gerade nicht zur Hand) und weitere Demos (ein Synthesizer und eine 4x4 Patchbay mit EQ und was mir sonst noch einfällt. Dann natürlich mit Source-Codes).&lt;br /&gt;
Anhand dieser Beispiele wird auch eine grobe Doku erstellt.&lt;br /&gt;
&lt;br /&gt;
== SVN-Repository ==&lt;br /&gt;
&lt;br /&gt;
 svn co svn://mikrocontroller.net/audiodsp&lt;br /&gt;
&lt;br /&gt;
Ein automatisch aktualisiertes Paket mit den Daten aus dem Repository gibt es unter http://www.mikrocontroller.net/download/audiodsp-snapshot.tar.gz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
&lt;br /&gt;
* 12.07.2007: Es wurde ein generisches Speicherinterfaces implementiert, welches Wartezyklen im DAP erlaubt. Dadurch kann man auf die jeweilgen Speicher des Boards eingehen. Z.Zt. ist nur eine einfaches Speicherschnittstelle für den asynchronen Betrieb des PSDRAM des Nexys-Boards implementiert. Die Schnittstelle ermöglicht den Anschluss eines RAM-Controller, welcher z.&amp;amp;nbsp;B. ein Quasi-Multiport-RAM darstellt. Getestet wurde der Stand mit dem Nexys-1000-Board.&lt;br /&gt;
&lt;br /&gt;
==To do==&lt;br /&gt;
&lt;br /&gt;
* nähere Zukunft&lt;br /&gt;
** Einen Konfigurationsdialog in die Demo-Programme einarbeiten mit denen man mit den Codecs etwas spielen kann (Line-In Level, Mikrofon-Level, Bypass, Head-Phone Volume) tlw. erledigt. Funktioniert aber nicht richtig, und daher noch nicht eingebaut. Quellcodes dazu sind vorhanden.&lt;br /&gt;
** Doku anhand der Demo-Programme erstellen&lt;br /&gt;
** C-Code schnipsel erstellen&lt;br /&gt;
&lt;br /&gt;
* fernere Zukunft&lt;br /&gt;
** Front-End des DAPs machen, mit dem sich DAP-Programme erstellen lassen, der Koeffizienten-, Daten- und Wellenform-Speicher beschrieben und gelesen werden kann, der Mikro-Code editierbar gemacht wird und noch ein paar Sachen mehr machbar sind&lt;br /&gt;
** weitere Module für den Rahmen (HDD-Core, weitere Routing-Möglichkeiten innerhalb der bisherigen Cores SDSP und Util)&lt;br /&gt;
&lt;br /&gt;
==Diskussion==&lt;br /&gt;
* http://www.mikrocontroller.net/topic/65205&lt;br /&gt;
* http://www.mikrocontroller.net/topic/34376&lt;br /&gt;
&lt;br /&gt;
Falls Interesse an einer Sammelbestellung für die Platinen und Bauteile besteht &lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/144288&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]] &lt;br /&gt;
[[Kategorie:Audio]]&lt;br /&gt;
[[Kategorie:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66884</id>
		<title>Audio-DSP mit Spartan 3-FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66884"/>
		<updated>2012-06-14T22:09:02Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* Änderungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [[Benutzer:TheMason]]&lt;br /&gt;
&lt;br /&gt;
==Ziel==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projekts ist es, eine FPGA-basierte Plattform aufzubauen mit der es möglich ist Synthesizer, Effektgeräte, Mischpulte  oder gar ein Harddiskrecording-System zu realisieren.&lt;br /&gt;
&lt;br /&gt;
==Feature-Liste==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften des Audio-Prozessors: &lt;br /&gt;
&lt;br /&gt;
* Oszillatoren&lt;br /&gt;
* Biquads (Filter)&lt;br /&gt;
* Addierer, Schalter, Verstärker (Multiplizierer)&lt;br /&gt;
* Delays&lt;br /&gt;
* Steuerung des Audio-Prozessors via SPI oder RS232&lt;br /&gt;
* 4 Mono Ein- und Ausgänge&lt;br /&gt;
* GPO (General Purpose Outputs) zur Konfiguration der Codecs&lt;br /&gt;
&lt;br /&gt;
==Übersicht==&lt;br /&gt;
[[Bild:Overview_wo_uc.jpg|thumb|500px]]&lt;br /&gt;
Basis des Audio-Systems ist das Xilinx Spartan 3-Development Board. An diesem Board werden 2 Audio-Codecs angschlossen von denen einer als Master und der andere als Slave agiert. Optional kann noch ein Mikrocontroller angeschlossen werden welcher den FPGA per SPI steuert. Da dieses Projekt mittlerweile recht umfangreich geworden ist, kann ich hier nur einen kurzen Umriss des Systems geben. Dabei beschränke ich mich auf die grobe Funktionsweise des Audio-Prozessors, erläutere das Interface (welches ich als Basis für weitere Projekte bereits nutze) und gebe einen kleinen Überblick über die Hardware.&lt;br /&gt;
&lt;br /&gt;
Das System kann (sofern man 2 Audio-Codecs, von denen einer als Master, der andere als Slave arbeitet, angeschlossen und konfiguriert hat) direkt genutzt werden, da der DAP per RS232 gesteuert werden kann. Der Audio-Prozessor startet mit einem Stereo-Tiefpass-Filter der sich auf den ersten Codec bezieht,&lt;br /&gt;
sodass man ein erstes Demo hat (selbst wenn es etwas unspektakulär ist)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nachbau==&lt;br /&gt;
&lt;br /&gt;
Wer sich dieses System nachbauen möchte, benötigt zunächst ein FPGA-Board. Mit dem Spartan-3-Board von Digilent gestaltet sich der Nachbau einfach, weil die Programmier-Dateien für den FPGA direkt für dieses Board verwendet werden können. Nutzer anderer Boards (Xilinx) müssten zuerst die UCF-Datei für die Pins ihres jeweiligen Boards anpassen, und dieses Projekt neu synthetisieren (compilieren). Nutzer von Altera-Boards hingegen müssen die BlockRAM-Instanzen auf die Altera-Architektur anpassen (den Inhalt der RAMs dabei nicht vergessen :-). Vielleicht findet sich ja der eine oder andere der den VHDL Code für Altera-FPGAs portiert.&lt;br /&gt;
Der eigentliche wichtige Teil eines Nachbaus ist der Codec-Teil. Dieses System verwendet zwar zwei Codecs, aber es kann auch mit einem gearbeitet werden. Als Codec kommt der TLV320AIC23B von Texas Instruments zum Einsatz. Diesen kann man als kostenloses Muster bei TI direkt bekommen. &lt;br /&gt;
Des weiteren benötigt man noch eine handvoll Bauteile wie Kondensatoren, Widerstände und einen Quarz. (Ein Codec MUSS als Master laufen, sonst hat das System keine Audio-Clocks, da diese nicht vom FPGA generiert werden)&lt;br /&gt;
Die Initialisierung des Codecs wird vom PC aus gemacht. Dazu dienen die 4 GPO-Leitungen auf dem B1-Verbinder. Da der Codec nur &amp;quot;halbes&amp;quot; SPI unterstüzt (man kann nur schreiben, nicht lesen) gestaltet sich die Initialisierung recht einfach.&lt;br /&gt;
Die 4 GPO-Leitungen teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* Chip-Select Codec 2&lt;br /&gt;
* Chip-Select Codec 1&lt;br /&gt;
* SPI Data Out&lt;br /&gt;
* SPI Clock&lt;br /&gt;
&lt;br /&gt;
==Audio-Prozessor (DAP)==&lt;br /&gt;
&lt;br /&gt;
[[bild:Overview dap core.JPG|thumb|500px|right]]&lt;br /&gt;
&lt;br /&gt;
Der FPGA beinhaltet in dem gesamten System einen Quasi-DSP. Quasi-DSP deshalb, da die Struktur im Gegensatz zu einem DSP bzw. Mikrocontroller keine Verzweigungen, Interrupts oder ähnliches zulässt. Der Audio-Prozessor besteht im wesentlichen aus 3 Teilen : einem Rahmen, einem SDSP (Small DSP)-Kern &lt;br /&gt;
sowie einem Utility-Kern. Beide Kerne können theoretisch parallel arbeiten, da jeder Kern einen eigenen Zustandsautomaten und einen eigenen Microcode-Speicher besitzen. Diese Möglichkeit ist allerdings noch nicht implementiert.&lt;br /&gt;
&lt;br /&gt;
Der SDSP-Kern besteht im wesentlichen aus einer MAC-Einheit, einem Speicher für Audiodaten, einem Koeffizienten-Speicher, einem Adressgenerator und mehreren Muxern, sowie dem schon angesprochenen Zustandsautomaten und dem Microcode. Weiterhin ist ein Hidden-Write- (bzw. Shadow Register) Mechanismus integriert,&lt;br /&gt;
welcher ein &amp;quot;knackserfreies&amp;quot; Aktualisieren von Koeffizienten ermöglicht. Alle diese Komponenten werden vom Microcode aus gesteuert (genau wie bei einem Mikrocontroller). Mit diesem Kern ist es möglich, Audiosignale zu bearbeiten. Zu Den Bearbeitungsmöglichkeiten zählen in erster Linie das Verändern der Lautstärke, Mischen, Filtern (Biquad) sowie Laden und Speichern von &lt;br /&gt;
Audiowerten.&lt;br /&gt;
&lt;br /&gt;
Der Utility-Kern besteht aus einem Akkumulator (für DDS), einem Shaper, einem Adressgenerator, einem Wavetable-Speicher, einem Zufallszahlengenerator, einigen Muxern, (einem Adressgenerator für SRAM, einem SRAM-Controller; diese sind allerdings nur nutzbar, wenn man das ganze mit dem ISE 6.2 synthetisiert) &lt;br /&gt;
und dem schon angesprochenen Zustandsautomaten und dem Microcode. Der Microcode steuert (genau wie beim SDSP-Kern) dabei die einzelnen Komponenten des Utility-Kerns. Dieser Kern ist für das Erzeugen von Audiosignalen zuständig, und erlaubt ein Audiosignal zu verzögern, sofern man die ISE-Version 6.2 verwendet (später dazu mehr). Als Wellenformen stehen Sägezahn, Rechteck (mit veränderbarer Pulsbreite), Rauschen sowie benutzderdefinierbare Wellenformen (Wavetable) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Der Rahmen besteht aus einem Zustandsautomaten, einem Programmspeicher, einigen Muxern, sowie einem doppelten I2S-Sender/Empfänger (für 2 Stereo Ein- und Ausgänge). In den Rahmen werden die beiden Kerne &amp;quot;eingehängt&amp;quot;. Die Kerne werden vom Programmspeicher aus mit Daten versorgt, und vom Zustandsautomaten angesteuert. Der Programmspeicher (PMEM) ist als 512x32 Bit organisiert. Das heißt, dass ein Befehl im Programmspeicher 32 Bit an Informationen enthält und der Audioprozessor max. 512 Befehle umfassen kann.&lt;br /&gt;
&lt;br /&gt;
===SDSP-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:SDSP-Struct.jpg|thumb|300px|left|Struktur des SDSP-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Der eigentliche Kern des DAPs ist die MAC-Einheit. Mit ihr werden die grundlegenden Operationen Multiplikation und Addition durchgeführt. Es ist eine 32x32-Bit-Einheit. &lt;br /&gt;
Die Funktionsweise des Kerns ist eigentlich recht einfach. &lt;br /&gt;
Die MAC-Einheit hat 2 Eingänge. Einer dieser Eingänge kann ein Audiosignal, ein Wert aus dem Audiospeicher (AMEM-BlockRAM) oder ein zuvor berechnetes Ergebnis sein. Der andere Eingang kann ein Koeffizient aus dem CMEM-BlockRAM oder eine Konstante (1.000, 0.000 oder -1.000) sein.&lt;br /&gt;
Der Ausgang (32-Bit, hart geclippt) geht auf das AMEM-BlockRAM und zum Ausgangs-Clipping. Das Ausgangsclipping schneidet das Audiosignal auf 24-Bit zurecht.&lt;br /&gt;
Die Adressen für die Speicher (AMEM und CMEM) werden im Addressgenerator erzeugt. Dieser wird von außen mit einer 8-Bit-Basis-Adresse gespeist und erzeugt einen Offset zu den Eingangsadressen. Er besitzt 2 setzbare Zähler und einige Multiplexer.&lt;br /&gt;
Alle Steuersignale der Komponenten von einem weiteren aus BlockRAM (MMEM) versorgt. Weiterhin wird von außen eine Startadresse vorgegeben. Dadurch lassen sich quasi Opcodes mit von außen vorgegeben Parametern (Adressen) aufrufen.&lt;br /&gt;
Das MMEM-BlockRAM wird nun einfach nur linear ausgelesen bis ein Stopbit gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Util-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Util-Core.jpg|thumb|300px|left|Struktur des Utility-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Beschreibung folgt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opcodes des DAP===&lt;br /&gt;
&lt;br /&gt;
Diese 32 Bit eines Befehls teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* 4 Bit = Opcode (für SDSP und Utility Kern gleich)&lt;br /&gt;
* 2 Bit = noch leer&lt;br /&gt;
* 1 Bit = Core Select (SDSP oder Utility)&lt;br /&gt;
* 1 Bit = Ende des Programms&lt;br /&gt;
* 4 Bit = Eingangsrouting (Kanal 1 - 4, Ergebnis SDSP-Kern, Ergebnis Utility-Kern)&lt;br /&gt;
* 4 Bit = Ausgangsrouting (SDSP-Ausgang auf Kanal 1-4, Utility-Ausgang auf Kanal 1-4)&lt;br /&gt;
* 8 Bit = Adresse 1 (bei SDSP für Audio-Memory, bei Utility-Kern für Datenspeicher)&lt;br /&gt;
* 8 Bit = Adresse 2 (bei SDSP für Koeffizientenspeicher, bei Utility-Kern unbenutzt)&lt;br /&gt;
&lt;br /&gt;
Das Eingangsrouting bestimmt, mit welchem Signal der gewählte Kern arbeiten soll. Dies können die Eingänge 1-4 aber auch ein vorher berechnetes Ergebnis des SDSP- bzw. Utility-Kerns sein. Das Ausgangsrouting bestimmt, von welchem Kern das Signal auf welchen Ausgang geroutet wird.&lt;br /&gt;
&lt;br /&gt;
Die Opcodes des DAPs sind:&lt;br /&gt;
&lt;br /&gt;
SDSP-Kern:&lt;br /&gt;
* Biquad rechnen&lt;br /&gt;
* Audiowert speichern&lt;br /&gt;
* Audiowert laden&lt;br /&gt;
* Move eines Wertes im Audiospeicher&lt;br /&gt;
* Summe rücksetzen&lt;br /&gt;
* Eingang zu Summe addieren&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe addieren&lt;br /&gt;
* Eingang zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Lautstärke &lt;br /&gt;
&lt;br /&gt;
Utility-Kern:&lt;br /&gt;
* Oszillator (DDS-Teil)&lt;br /&gt;
* Waveshaper&lt;br /&gt;
* Verzögerung&lt;br /&gt;
&lt;br /&gt;
Der Ablauf eines Audio-Programms ist folgender:&lt;br /&gt;
&lt;br /&gt;
Sobald ein neues Sample anliegt, wird die Abarbeitung des Programms von Adresse 0x0000 an im PMEM angestoßen. Es wird dabei jeweils ein Befehl geladen und Daten wie Opcode und Adressen liegen dabei an beide Kernen gleichermaßen an. Ist das Programm-Ende-Bit nicht gesetzt, so wird der jeweilige Kern (mit dem im Opcode angegeben Routing) angesteuert. Legt der betreffende Kern sein Ready-Signal auf 1, so wird der nächste Befehl abgearbeitet. Dieses Verhalten (Laden und Verteilen von Opcode-Daten sowie die Ablaufsteuerung, also das Ansteuern des Programms, Ansteuern der einzelnen Kerne, warten auf dessen Abarbeitung und das Programmende) wird vom Rahmen übernommen.&lt;br /&gt;
&lt;br /&gt;
===Speicherorganisation===&lt;br /&gt;
&lt;br /&gt;
Alle Speicher die vom DAP angesprochen werden, haben eine Wortbreite von 32 Bit, der Zugriff erfolgt aber ausschließlich über eine Breite von 8 Bit (Interface).&lt;br /&gt;
&lt;br /&gt;
DAP&lt;br /&gt;
* Programmspeicher 	(PMEM)   0x0000 - 0x07ff&lt;br /&gt;
&lt;br /&gt;
SDSP&lt;br /&gt;
* Audiospeicher   	(AMEM)   von außen nicht zugänglich&lt;br /&gt;
* Koeffizientenspeicher 	(CMEM)   0x2000 - 0x2023  (man &amp;quot;sieht&amp;quot; nur den Hidden Write -&amp;gt; später mehr dazu)&lt;br /&gt;
* Microcodespeicher      (MMEM)   0x4000 - 0x47ff&lt;br /&gt;
&lt;br /&gt;
Utility-Core&lt;br /&gt;
* Datenspeicher          (DMEM)   0x6000 - 0x67ff&lt;br /&gt;
* Wavetable-Speicher      (WMEM)   0x8000 - 0x87ff&lt;br /&gt;
* Microcodespeicher      (UMEM)   0xa000 - 0xa7ff&lt;br /&gt;
&lt;br /&gt;
===Hidden-Write===&lt;br /&gt;
Um bei Änderung der Koeffizienten Knackser zu vermeiden (die dadurch entstehen das der Koeffizient nur teilweise [durch 8-Bit-Zugriffe] geändert wird, währenddessen aber Audio trotzdem noch &amp;quot;weiterläuft&amp;quot; und mit &amp;quot;falschen&amp;quot; Zwischenwerten gerechnet wird), ist ein Mechanismus implementiert, der die zu ändernden Koeffizienten im Hintergund in den Speicher schreibt. Um diesen Mechanismus zu nutzen, müssen zuerst die Koeffizienten in interne Register&lt;br /&gt;
geschrieben werden. Die Register (es sind 8 32-Bit-Register) liegen im Speicherbereich 0x2000 bis 0x201f. Die Speicherstelle 0x2020 gibt die Startadresse innerhalb des Koeffizientenspeichers an. Diese Adresse ist nur 8 Bit breit. Die Speicherstelle 0x2021 gibt an, wieviele der 8 Register übertragen werden sollen. Die Speicherstelle 0x2022 löst den Kopiervorgang aus. Hier reicht es, ein Dummy-Byte zu schreiben. Um den Kopiervorgang zu beenden (MUSS GEMACHT WERDEN!, sonst können keine weiteren Koeffizientenupdates gemacht werden), schreibt man an Speicherstelle 0x2023 ebenfalls ein Dummy-Byte.&lt;br /&gt;
&lt;br /&gt;
===I/O Register===&lt;br /&gt;
&lt;br /&gt;
Es gibt noch einen 8-Bit breiten Adressbereich innerhalb des DAPs, mit dem der I2S-Teil stummgeschaltet werden kann. Weiterhin hat man die Möglichkeit, die Anzahl der Systemtakte pro Sample und die Anzahl der aktiven Systemtakte (also die Zeit die der Audioprozessor beschäftigt ist) zu ermitteln. Dadurch lässt sich eine Auslastungsanzeige des DAPs realisieren.&lt;br /&gt;
&lt;br /&gt;
===Interface===&lt;br /&gt;
&lt;br /&gt;
Um von außen nun ein Programm (bzw. Koeffizienten und Daten) zu laden, ist eine einfach zu handhabende und erweiterbare Schnittstelle implementiert. Die Schnittstelle kann per RS232 (fest eingestellt auf 115,2kBaud) oder per SPI (wird hardwaremäßig eingestellt) angesteuert werden. Die Schnittstelle in ihrer Gesamtheit ist schichtweise aufgebaut und beginnt mit einem Daten-Dispatcher. Dieser Daten-Dispatcher entscheidet (nachdem dieser selektiert wurde) mit dem ersten Byte, an welches angeschlossene Gerät der weitere Datenstrom geleitet wird.&lt;br /&gt;
&lt;br /&gt;
Als angeschlossene Geräte sind im aktuellen Entwurf ein Gerät namens &amp;quot;StdIO&amp;quot; und der Audioprozessor verfügbar.&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;StdIO&amp;quot;-Gerät steuert die 7-Segment-Anzeige (16-Bit-Hexadezimalanzeige oder 32-Bit-Einzelsegmentanzeige) sowie die 8 Leuchtdioden, und erlaubt es, die 3 Drucktaster sowie die 8 Schiebeschalter auszulesen.&lt;br /&gt;
&lt;br /&gt;
Der Audioprozessor besteht (schnittstellenseitig) nur aus einer Speicherzugriffsschnittstelle. Diese Schnittstelle entscheidet mit dem ersten Byte (sobald es selektiert wurde), ob in den Speicher geschrieben, von diesem gelesen, ein I/O-Schreib- oder -Lesezugriff erfolgen soll.&lt;br /&gt;
Die folgenden 2 Bytes (im Falle eines I/O-Zugriffs nur 1 Byte) bestimmen die Adresse und damit den Speicherbereich des Audioprozessors, auf den zugegriffen werden soll. Die Speicherschnittstelle besitzt einen Autoinkrementierer,&lt;br /&gt;
mit dem fortlaufende Bytes einfach hintereinander geschrieben werden können, ohne dass jedes mal wieder der FPGA, das Gerät und die neue Adresse neu geschrieben werden müssen, was den Zugriff erheblich beschleunigt.&lt;br /&gt;
&lt;br /&gt;
Ursprünglich basierte das System auf einem SPI-Interface. Dabei wurde die Chip-Select-Leitung als &amp;quot;globaler&amp;quot; Interface-Reset betrachtet, d.h. war die Leitung auf High, war der FPGA deselektiert und und alle Interface-Zustandsautomaten wurden im Reset gehalten. Erst mit dem Setzen dieser Leitung wurde der FPGA angesprochen. (erstes Byte -&amp;gt; Daten-Dispatcher, folgende Bytes gehen an das ausgewählte Gerät). Weiterhin hat SPI die Eigenschaft, dass mit jedem gesendeten Byte auch eines empfangen wurde. Der Umstand, dass RS232 weder eine Chip-Select Leitung benötigt noch eine synchrone Übertragung erzwingt, führt zu dem Umstand, dass man bei Nutzung von RS232 einige Befehle zusätzlich benötigt. Diese Befehle werden durch das Zeichen 0x1b (ESC) eingeleitet. Soll statt der &amp;quot;Spezialfunktion&amp;quot; das Byte 0x1b übertragen werden, so wird dieses einfach erneut gesendet. Soll die Chip-Select-Leitung gesetzt bzw. gelöscht werden, so wird die Sequenz 0x1b 0x00 (Selektieren) bzw.&lt;br /&gt;
0x1b 0x01 (Deselektieren) gesendet. Soll ein zuvor im Ausgangsregister gesetztes Byte gesendet werden, so muss die Sequenz 0x1b 0x02 gesendet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
0x121b auf dem 7-Segment-Display per RS232 anzeigen:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x00      (Hi-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x12      (Wert 12)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x01      (Lo-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x1b 0x1b (Wert 1b -&amp;gt; zu beachten: wenn der Wert 0x1b übertragen werden soll, muss dieser doppelt gesendet werden !!)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Beispiel, um in den Programmspeicher des Audioprozessors an Adresse 0x0010 das Langwort 0x12233445 zu schreiben:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf1      (DAP selektieren)&lt;br /&gt;
*- 0x00      (Speicher schreiben)&lt;br /&gt;
*- 0x00      &lt;br /&gt;
*- 0x10      (Adresse 0x0010 -&amp;gt; PMEM-Adresse 0x010)&lt;br /&gt;
*- 0x12	    (Adresse 0x0010 -&amp;gt; 0x12)	&lt;br /&gt;
*- 0x23	    (Adresse 0x0011 -&amp;gt; 0x23, autoincrement)&lt;br /&gt;
*- 0x34      (Adresse 0x0012 -&amp;gt; 0x34, autoincrement)&lt;br /&gt;
*- 0x45      (Adresse 0x0013 -&amp;gt; 0x45, autoincrement)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Auslesen der 8 Schalter:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x04      (Schalter auslesen)&lt;br /&gt;
*- 0x00	    (dummy byte -&amp;gt; überträgt Schalterstellung in Ausgaberegister)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man die 8 Schalterstellungen binärcodiert)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Der Datendispatcher (welcher mit dem ersten Byte nach dem Selektieren des FPGAs [0x1b 0x00] angesprochen wird) hat weiterhin einige nützliche Funktionen, die in ihrer Gesamtheit allerdings noch nicht ausführlich getestet wurden. Darunter sind Funktionen, mit denen Informationen über die an den Ports des Daten-Dispatchers angeschlossenen Geräte zu ermitteln. Diese Funktion kann dazu genutzt werden, um zu ermitten, welche Geräte im FPGA implementiert sind und an welchen Ports welche Geräte angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
Anzahl der Ports des Daten-Dispatchers liefern:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xed      (Anzahl Ports lesen)&lt;br /&gt;
*- 0x00      (dummy byte -&amp;gt; überträgt Inhalt des Ausgaberegisters)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man 0x22)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
===DAP-Modul-Schnipsel===&lt;br /&gt;
&lt;br /&gt;
Um mal &amp;quot;eben&amp;quot; mit dem DAP zu spielen, ein paar Schnipsel die sich recht leicht zu kompletten Funktionsblöcken zusammenschließen lassen.&lt;br /&gt;
Es werden hier nur die RS232-Sequenzen mit einer kurzen Erklärung aufgelistet.&lt;br /&gt;
&lt;br /&gt;
*Dual Mono Biquad&lt;br /&gt;
&lt;br /&gt;
*ESC 0x00 - FPGA selektieren&lt;br /&gt;
*0xF1     - DAP auswählen&lt;br /&gt;
*0x00 0x00 0x00 - Memory Write (Adresse 0x0000 -&amp;gt; Program Memory)&lt;br /&gt;
*0x10 0x00 0x00 0x08 - Biquad mit Kanal 1 (0) rechnen (AMEM = 0x00;CMEM = 0x08) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x10 0xf0 0x08 0x10 - Biquad mit vorherigem Ergebnis (0xf) rechnen (AMEM = 0x08; CMEM = 0x10) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x01 0x00 0x00 0x00 - Audioprogramm Ende (wichtig !!!)&lt;br /&gt;
*ESC 0x01 - DAP &amp;amp; FPGA deselektieren&lt;br /&gt;
&lt;br /&gt;
Erklärung :&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Opcodes 0x100008 deutet an, dass ein Biquad durchgerechnet werden soll. Das Eingangsregister 0 bedeutet, dass Kanal 1 des 1. Codecs verwendet wird. Das Ausgangsregister, welches nach Fertigstellung des Ergebnisses benutzt werden soll, ist 0 (-&amp;gt; Kanal 1 des 1. Codecs). Der Teil 0x00 0x08 bedeutet hierbei, dass die Biquad-Koeffizienten im CMEM ab Adresse 0x08 stehen. Die Audio-Zwischenwerte werden in den Audiospeicher AMEM ab Adresse 0x00 gelegt.&lt;br /&gt;
Der zweite Opcode (0x10f00810) rechnet ebenfalls ein Biquad durch. Nur dass hier statt Kanal 1 des Codecs das voher vom SDSP berechnete Ergebnis verwendet werden soll (Kanal 0xf, wenn man so will). Ausgangsregister ist auch hier wieder Kanal 1. Da dieser Biquad unabhängig vom ersten (d.h. mit anderen Parametern) gerechnet werden soll, sind hier logischerweise auch andere Adressen für AMEM (0x08) und CMEM (0x10) angegeben. Die CMEM-Adresse ist dabei etwas unkritischer, da es ja durchaus sein kann, dass ein Audiosignal zweimal mit den selben Biquad-Werten gerechnet werden soll, bzw. unterschiedliche Kanäle mit den selben Biquad-Werten, z.b. bei einem Stereo-Equalizer. Kritischer ist allerdings die Verwendung der AMEM-Adresse. Diese sollte für jede Operation (sofern AMEM denn verwendet wird) unterschiedlich sein, vor allem bei der Berechnung von Biquads. Dies hat den Grund, dass bei Operationen, die dieselben AMEM Adressen haben, die vorher berechneten Werte überschrieben werden. Dies ist bei Biquads gaanz böse (kann u.U. SEHR laut werden), und vom Ergebnis her nicht vorhersagbar.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
[[bild:Fpga_ext_board_schematic_no_uc.JPG|thumb|500px]]&lt;br /&gt;
&lt;br /&gt;
Wie Eingangs erwähnt, benötigt das System eine (bzw. zwei) Audio-Codecs. Im aktuellen Schaltplan wird auf einen Mikroprozessor verzichtet. Dieser diente im System primär zu Initialisierung der Codecs. Dieser Vorgang kann nun vom PC aus gesteuert werden, da in der neuen ISE-6.2-Version 4 Leitungen herausgeführt wurden, welche per RS232 gesetzt und gelöscht werden. &lt;br /&gt;
Wer das System nachbauen möchte, kann entweder die TLV320AIC23B-Codecs oder auch beliebige andere Codecs verwenden, solange einer als Master und der andere als Slave arbeitet und beide auf den I2S-Modus mit 64FS und 20-Bit-Wortlänge eingestellt sind. Die Initialisierung dieser Codecs muss dann aber separat vorgenommen werden (wobei man dann wahrscheinlich nicht um einen uC drumrum kommt). Um das System zu testen (Programme und Koeffizienten in den DAP einzuspielen), wird lediglich eine serielle Schnittstelle verwendet. Wer will, kann aber genausogut den SPI-Modus verwenden und den DAP direkt von einem Mikrocontroller aus steuern. Zur Auswahl der verwendeten Schnittstelle (RS232 oder SPI) wird Pin 13 des B1-Connectors benutzt. Liegt dieser Pin auf GND, so wird der FPGA per RS232 gesteuert. Liegt dieser Pin auf 3.3V, so wird der FPGA per SPI gesteuert.&lt;br /&gt;
&lt;br /&gt;
Hier der Schaltplan meines verwendeten Audio-Boards.&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier noch die Pinbelegung des B1-Erweiterungssteckers:&lt;br /&gt;
&lt;br /&gt;
*01 GND&lt;br /&gt;
*02 VCC 5V&lt;br /&gt;
*03 VCC 3.3V&lt;br /&gt;
*04 N.C.&lt;br /&gt;
*05 SPI_CS - Chip Select (von uC nach FPGA)&lt;br /&gt;
*06 N.C.&lt;br /&gt;
*07 SPI_DI - SPI Data In (von uC nach FPGA)&lt;br /&gt;
*08 BCLK - Bit Clock (von Master Codec)&lt;br /&gt;
*09 SPI_CLK - SPI Clock (von uC nach FPGA)&lt;br /&gt;
*10 LRCLK - LR-Clock (von Master Codec)&lt;br /&gt;
*11 SPI_DO - SPI Data Out (von FPGA nach uC)&lt;br /&gt;
*12 SDOUT1 - zum D/A Wandler (Codec) 1&lt;br /&gt;
*13 IF_SEL - Interface Select (GND = RS232; VCC3.3 = SPI)&lt;br /&gt;
*14 SDIN1 - vom A/D Wandler (Codec) 1&lt;br /&gt;
*15 RXD_OUT - RS232 Signal vom MAX232 zum uC&lt;br /&gt;
*16 SDIN2 - vom A/D Wandler (Codec) 2&lt;br /&gt;
*17 TXD_IN - RS232 Signal vom uC zum MAX232&lt;br /&gt;
*18 SDOUT2 - zum D/A Wandler (Codec) 2&lt;br /&gt;
*19 GPO 3 - Chip-Select Codec 2&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 2 - Chip-Select Codec 1&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 1 - SPI-Data out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 0 - SPI-Clock Out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
&lt;br /&gt;
==Nexys Board==&lt;br /&gt;
&lt;br /&gt;
Im SVN Repository (s.u.) gibt es eine Version des DAPs für das Nexys Board.&lt;br /&gt;
Diese ist voll SW-Kompatibel zum alten Spartan 3 Board (allerdings z.Z. nur über RS232 steuerbar). Neu bei der Version ist das das Speicherinterface generisch ausgelegt wurde und ein einfacher SRAM-Controller für das Nexys Board PSDRAM geschrieben wurde. Durch das generische Interface ist es möglich andere Speicherarten anzubinden. Der verwendete Codec ist wie schon im bisherigen Projekt der TLV320AIC23B. Dieser wird via RS232 (6-pin Port A des Nexys Boards) über die GPO Leitungen (6-pin Port D des Nexys Boards) initialisiert. Die eigentlichen Datenleitungen des Codecs liegen an Port B (BCLK, LRCLK, DIN, DOUT).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download des DAP als MCS-File für das Nexys-1000 Board : [[Media:Nexys_dap.zip]]&lt;br /&gt;
&lt;br /&gt;
Diese Version ist voll lauffähig (wurde mit den Demos getestet).&lt;br /&gt;
Die Pin Belegung für die RS232 und den Audio-Codec ist wie folgt :&lt;br /&gt;
&lt;br /&gt;
Header A : RS232 Schnittstelle&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Pin 1 : RxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : TxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V/5V für MAX232/MAX3232)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header B : I2S Schnittstelle für 1 Codec&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : BitClk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : L/R Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : SDIN&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : SDOUT&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V für den Codec)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header D : Codec-Konfiguration via SPI&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : Codec 2 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : Codec 1 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : Codec SPI Data&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : Codec SPI Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DAP mit selbstgelötetem FPGA-Board==&lt;br /&gt;
&lt;br /&gt;
Auf einen Beitrag von Thomas Pototschnig hin bin ich auf sein selbstentworfenes Spartan-3-FPGA-Board (Grafikkarte) aufmerksam geworden. Thomas hat mir die Erlaubnis gegeben dieses Board für den DAP verwenden zu können und die Schaltpläne hier zu veröffentlichen. Nachdem ich von ihm noch einige Vorversionen (nur die Platinen) ergattern konnte und diese erfolgreich aufgebaut (mit Spartan 3-200 und -400) habe, bin ich von diesem Board echt begeistert. Danke nochmals.&lt;br /&gt;
&lt;br /&gt;
[[Bild:FPGA-Board.jpg|thumb|300px|left]]&lt;br /&gt;
&lt;br /&gt;
Hier Schaltplan und Layout. &lt;br /&gt;
&lt;br /&gt;
[[Media:miniFPGA-Board.zip]]&lt;br /&gt;
&lt;br /&gt;
Das Board ist zweiseitig und die &amp;quot;schlimmsten&amp;quot; zu lötenden Bauteile sind lediglich der FPGA (QFP-144) und die beiden RAMs (SOJ36, ekelig). Der Rest ist recht einfach. Auch die Inbetriebnahme des Boards gestaltete sich problemlos.&lt;br /&gt;
&lt;br /&gt;
Den Quellcode für den DAP musste ich etwas ändern und abspecken. Durch den ineffizienten VHDL-Code der MAC-Einheit gestaltete es sich schwierig, den Entwurf synthetisierbar zu machen. Das Synthetisieren auf einem FT256 gestaltete sich einfacher. Hier ist noch dergestalt Handlungsbedarf, dass die MAC-Einheit überarbeitet werden muss. &lt;br /&gt;
Der abgespeckte Entwurf läuft auf dem FPGA-Board mit einem Spartan 3-400 sowie auf einem Spartan 3-200. &lt;br /&gt;
Den Audio-Codec, das FPGA Board, einen AVR und noch etwas IO-Kram habe ich auf eine Lochrasterplatine aufgebaut. Was noch fehlt, sind MIDI- und SD/MMC-Karten-Schnittstellen. Dann hat man eine schöne Plattform für Synthesizer und Effektgeräte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anmerkung==&lt;br /&gt;
&lt;br /&gt;
Da, wie schon gesagt, das Projekt komplett auf meinem &amp;quot;Mist&amp;quot; gewachsen ist, wird es wohl noch eine Weile dauern, bis alles, was den DAP betrifft, hier in diesem Artikel (und auch in einem Dokumentations-PDF) eingearbeitet ist. Ich werde (sofern ich Zeit dazu habe) noch ein Delphi-Programm mit Sourcecode einstellen, welches den DAP richtig nutzbar macht, so dass man dann direkt damit &amp;quot;spielen&amp;quot; kann. Eine umfangreiche und vollständige Dokumentation würde momentan einfach zu viel Zeit in Anspruch nehmen, und ich möchte langsam das Projekt vorstellen, um Anregung, Kritik und Verbesserungsvorschläge ernten zu können. Ich hoffe, weitere Leute zu finden, um diesem Projekt noch mehr Leben und Möglichkeiten einhauchen zu können.&lt;br /&gt;
&lt;br /&gt;
==Fotos==&lt;br /&gt;
&lt;br /&gt;
Ursprüngliche Version:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Gesamt_wo_uc.jpg|thumb|200px|left|Spartan.3-Board und Expansion-Board]]&lt;br /&gt;
[[Bild:Codecs.jpg|thumb|200px|left|Expansion Board]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nexys-Board:&lt;br /&gt;
[[Bild:dap_nexys_v1.jpg|thumb|200px|left|Nexys-Board mit 1 Audio-Codec]]&lt;br /&gt;
[[Bild:Nexys-board-gesamt.jpg|thumb|200px|left|Nexys-Board mit Lochraster-Board und 2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
[[Bild:Nexys-board-codecs-1.jpg|thumb|200px|left|2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufbau von [[Benutzer:Andreas]]:&lt;br /&gt;
[[Bild:Nexys-Audio-DSP-Foto-Andreas.jpg|thumb|600px|left|Nexys + Breadboard + 1 [[Audio Codec Board]]]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Synth-gesamt-klein.jpg|thumb|500px|left|Aufbau des DAPs mit FPGA-Board (entworfen von Thomas Pototschnig) auf Lochraster an AVR, Codec und weiterer IO]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap-Synth-01.jpg|thumb|300px|left|Synth Board. DAP mit AVR,Codec, MIDI-Interface, RS232 (schaltbar) und LCD]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_Ansicht_02.jpg|thumb|300px|left|Synth Board. Komplettansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_klein_3.jpg|thumb|600px|left|Synth Board. Synth-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Oben.jpg|thumb|300px|left|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Unten.jpg|thumb|300px|right|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Träger-und-Mainboard.jpg|thumb|600px|left|Selbstgeroutetes DAP-Board auf Trägerplatine]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Seite.jpg|thumb|300px|left|DAP-Board mit Touch-Display Seitenansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display.jpg|thumb|600px|left|DAP-Board mit Touch-Display]]&lt;br /&gt;
&lt;br /&gt;
Diese Version des DAP hat ein Grafikdisplay incl. Touchpanel. Die Ansteuerung übernimmt der FPGA. Dort ist einer kleiner &amp;quot;Grafik-Prozessor&amp;quot; integriert, der das Update des Displays und das Kopieren der Bitmaps übernimmt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synthesizer Ansicht 1.jpg|thumb|600px|left|]]&lt;br /&gt;
Synth-Board. Komplettansicht in einem Cherry-Tastaturgehäuse (wie dafür gemacht :-)) im Synthesizer-Stil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synth Komplett.jpg|thumb|600px|left|Fertige Version des DAP als Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
Der komplette Synthesizer mit schicker Frontplatte und passendem (oben schon erwähnten :-)) Cherry-Tastatur-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Version 1.5.jpg|thumb|600px|left|Heue Hardwareversion der DAP-Hauptplatine]]&lt;br /&gt;
&lt;br /&gt;
Diese Version beinhaltet folgendes : :-) &lt;br /&gt;
&lt;br /&gt;
 - Xilinx XC3S400&lt;br /&gt;
 - ATmega2561&lt;br /&gt;
&lt;br /&gt;
 - 16 MByte (8Mx16) SDRAM&lt;br /&gt;
 - µSD Card Slot&lt;br /&gt;
 - AT45DB321 DataFlash&lt;br /&gt;
 - 24C512 EEProm&lt;br /&gt;
&lt;br /&gt;
 - TLC320AI23B Audio Codec mit Kopfhörer Ausgang&lt;br /&gt;
 - CS5343 A/D Wandler&lt;br /&gt;
 - CS4344 D/A Wandler&lt;br /&gt;
&lt;br /&gt;
 - MIDI&lt;br /&gt;
 - RS232&lt;br /&gt;
 - etlichen IO-Pins vom AVR und FPGA&lt;br /&gt;
 - 2 separaten Clock-Oszillatoren (nicht bestückt)&lt;br /&gt;
&lt;br /&gt;
... und weiterem Kleinkram (Level-Shifter, LDO, Platform-Flash, usw ... und vielen 100nF-Kondensatoren)&lt;br /&gt;
&lt;br /&gt;
Ideal zum Aufbau einer Audioplattform. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audio-Demos==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein EQ-Demo mit rosa Rauschen. Klingt wie eine Meeresbrandung.&lt;br /&gt;
&lt;br /&gt;
[[Media:eq_demo1.zip]]&lt;br /&gt;
&lt;br /&gt;
Der DAP als Synth. Der DAP wird komplett vom PC aus gesteuert (Hüllkurve, Sequencer und Filterberechnung werden im PC gemacht).&lt;br /&gt;
&lt;br /&gt;
[[Media:synthdemo1.wav.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MC505-Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen von meiner Roland MC505 Groovebox. Es wird einfach nur ein Werkspreset abgespielt und durch den DAP gejagt.&lt;br /&gt;
&lt;br /&gt;
* [[Media:mc505-eq-demo.wav.zip|EQ-Demo]]&lt;br /&gt;
* [[Media:mc505-filter-demo.wav.zip|Filter-Demo (Tiefpass/Hochpass/Notch)]]&lt;br /&gt;
* [[Media:mc505-delay-demo.wav.zip|Delay-Demo (137BPM [657ms &amp;amp; 876 ms]/Chorus)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Synth-Board Audio-Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen vom DAP in Verbindung mit einem AVR, der die Filterkoeffizientenberechnung sowie eine komplette Synthesizersteuerung beinhaltet, also quasi einen Synthesizer aus dem DAP macht (inkl. MIDI-Steuerung).&lt;br /&gt;
&lt;br /&gt;
MIDI-Sequenz und Tiefpassfilter (Filter und Modulation über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-01.mp3]]&lt;br /&gt;
&lt;br /&gt;
Dieselbe MIDI-Sequenz mit Hochpassfilter (Filter und Modulation ebenfalls über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-02.mp3]]&lt;br /&gt;
&lt;br /&gt;
Eine eher Techno-ähnliche Demo, welche die Auflösung des Systems (DAP+AVR+MIDI) ein wenig zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap_syn_demo_03.mp3]]&lt;br /&gt;
&lt;br /&gt;
==Delphi Tools==&lt;br /&gt;
&lt;br /&gt;
Um den DAP nutzbar zu machen benötigt man entweder ein uC Programm oder ein PC Programm. Da das verwenden von PC-Programmen einfacher fürs Spielen und Experimentieren ist, werde ich hier im Laufe der Zeit kleine Demo-Programme aber auch komplette Front-Ends für den DAP reinstellen. Die Delphi-Programme sind allesamt in Turbo-Delphi geschrieben und die dazugehörigen Quellcodes werden ebenfalls im Laufe der Zeit geuploaded. Ich werde allerdings zuerst noch das Feature des Konfigurierens der Codecs vom PC aus einbauen. &lt;br /&gt;
Nachtrag zum Konfigurieren des Codecs : Prinzipiell funktioniert es, allerdings ist das mit häßlichen Nebengeräuschen verbunden, da ich bei jeder Änderung der Lautstärke im Codec, diesen auch Resetten muß, da sonst immer beide Codecs beschrieben werden, was unschön ist. Warum dies so ist kann ich leider nicht sagen, da ich keine Möglichkeit habe die SPI-Leitungen mitzusniffen (bräuchte dafür einen kleinen LA, den ich nicht habe). &lt;br /&gt;
&lt;br /&gt;
* Demo eines 3 Band Stereo Equalizers. (Der Knopf &amp;quot;MoveIt!&amp;quot; bringt Leben ins Demo): [[Media:dap_eq_demo.zip]]&lt;br /&gt;
* Demo eines 4 Kanal Mono Mixers mit Monitor (Vorhör)-Ausgang: [[Media:dap_mix_demo.zip]]&lt;br /&gt;
* Demo eines Synthesizer-Filters: [[Media:dap_filter_demo.zip]]&lt;br /&gt;
* Demo eines 2 Kanal Delays (Der Button &amp;quot;MoveIt!&amp;quot; macht daraus einen Chorus :-))): [[Media:dap_delay_demo.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Quellcodes für das EQ-Demo, das Filter-Demo und das Delay-Demo : [[Media:dap_demos_plus_delphi_source.zip]]&lt;br /&gt;
&lt;br /&gt;
Es folgen noch der Quellcode für den Mischer (hab ich gerade nicht zur Hand) und weitere Demos (ein Synthesizer und eine 4x4 Patchbay mit EQ und was mir sonst noch einfällt. Dann natürlich mit Source-Codes).&lt;br /&gt;
Anhand dieser Beispiele wird auch eine grobe Doku erstellt.&lt;br /&gt;
&lt;br /&gt;
== SVN-Repository ==&lt;br /&gt;
&lt;br /&gt;
 svn co svn://mikrocontroller.net/audiodsp&lt;br /&gt;
&lt;br /&gt;
Ein automatisch aktualisiertes Paket mit den Daten aus dem Repository gibt es unter http://www.mikrocontroller.net/download/audiodsp-snapshot.tar.gz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
&lt;br /&gt;
* 12.07.2007: Es wurde ein generisches Speicherinterfaces implementiert, welches Wartezyklen im DAP erlaubt. Dadurch kann man auf die jeweilgen Speicher des Boards eingehen. Z.Zt. ist nur eine einfaches Speicherschnittstelle für den asynchronen Betrieb des PSDRAM des Nexys-Boards implementiert. Die Schnittstelle ermöglicht den Anschluss eines RAM-Controller, welcher z.&amp;amp;nbsp;B. ein Quasi-Multiport-RAM darstellt. Getestet wurde der Stand mit dem Nexys-1000-Board.&lt;br /&gt;
&lt;br /&gt;
==To do==&lt;br /&gt;
&lt;br /&gt;
* nähere Zukunft&lt;br /&gt;
** Einen Konfigurationsdialog in die Demo-Programme einarbeiten mit denen man mit den Codecs etwas spielen kann (Line-In Level, Mikrofon-Level, Bypass, Head-Phone Volume) tlw. erledigt. Funktioniert aber nicht richtig, und daher noch nicht eingebaut. Quellcodes dazu sind vorhanden.&lt;br /&gt;
** Doku anhand der Demo-Programme erstellen&lt;br /&gt;
** C-Code schnipsel erstellen&lt;br /&gt;
&lt;br /&gt;
* fernere Zukunft&lt;br /&gt;
** Front-End des DAPs machen, mit dem sich DAP-Programme erstellen lassen, der Koeffizienten-, Daten- und Wellenform-Speicher beschrieben und gelesen werden kann, der Mikro-Code editierbar gemacht wird und noch ein paar Sachen mehr machbar sind&lt;br /&gt;
** weitere Module für den Rahmen (HDD-Core, weitere Routing-Möglichkeiten innerhalb der bisherigen Cores SDSP und Util)&lt;br /&gt;
&lt;br /&gt;
==Diskussion==&lt;br /&gt;
* http://www.mikrocontroller.net/topic/65205&lt;br /&gt;
* http://www.mikrocontroller.net/topic/34376&lt;br /&gt;
&lt;br /&gt;
Falls Interesse an einer Sammelbestellung für die Platinen und Bauteile besteht &lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/144288&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]] &lt;br /&gt;
[[Kategorie:Audio]]&lt;br /&gt;
[[Kategorie:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66883</id>
		<title>Audio-DSP mit Spartan 3-FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66883"/>
		<updated>2012-06-14T22:07:44Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* Audio Demos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [[Benutzer:TheMason]]&lt;br /&gt;
&lt;br /&gt;
==Ziel==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projekts ist es, eine FPGA-basierte Plattform aufzubauen mit der es möglich ist Synthesizer, Effektgeräte, Mischpulte  oder gar ein Harddiskrecording-System zu realisieren.&lt;br /&gt;
&lt;br /&gt;
==Feature-Liste==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften des Audio-Prozessors: &lt;br /&gt;
&lt;br /&gt;
* Oszillatoren&lt;br /&gt;
* Biquads (Filter)&lt;br /&gt;
* Addierer, Schalter, Verstärker (Multiplizierer)&lt;br /&gt;
* Delays&lt;br /&gt;
* Steuerung des Audio-Prozessors via SPI oder RS232&lt;br /&gt;
* 4 Mono Ein- und Ausgänge&lt;br /&gt;
* GPO (General Purpose Outputs) zur Konfiguration der Codecs&lt;br /&gt;
&lt;br /&gt;
==Übersicht==&lt;br /&gt;
[[Bild:Overview_wo_uc.jpg|thumb|500px]]&lt;br /&gt;
Basis des Audio-Systems ist das Xilinx Spartan 3-Development Board. An diesem Board werden 2 Audio-Codecs angschlossen von denen einer als Master und der andere als Slave agiert. Optional kann noch ein Mikrocontroller angeschlossen werden welcher den FPGA per SPI steuert. Da dieses Projekt mittlerweile recht umfangreich geworden ist, kann ich hier nur einen kurzen Umriss des Systems geben. Dabei beschränke ich mich auf die grobe Funktionsweise des Audio-Prozessors, erläutere das Interface (welches ich als Basis für weitere Projekte bereits nutze) und gebe einen kleinen Überblick über die Hardware.&lt;br /&gt;
&lt;br /&gt;
Das System kann (sofern man 2 Audio-Codecs, von denen einer als Master, der andere als Slave arbeitet, angeschlossen und konfiguriert hat) direkt genutzt werden, da der DAP per RS232 gesteuert werden kann. Der Audio-Prozessor startet mit einem Stereo-Tiefpass-Filter der sich auf den ersten Codec bezieht,&lt;br /&gt;
sodass man ein erstes Demo hat (selbst wenn es etwas unspektakulär ist)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nachbau==&lt;br /&gt;
&lt;br /&gt;
Wer sich dieses System nachbauen möchte, benötigt zunächst ein FPGA-Board. Mit dem Spartan-3-Board von Digilent gestaltet sich der Nachbau einfach, weil die Programmier-Dateien für den FPGA direkt für dieses Board verwendet werden können. Nutzer anderer Boards (Xilinx) müssten zuerst die UCF-Datei für die Pins ihres jeweiligen Boards anpassen, und dieses Projekt neu synthetisieren (compilieren). Nutzer von Altera-Boards hingegen müssen die BlockRAM-Instanzen auf die Altera-Architektur anpassen (den Inhalt der RAMs dabei nicht vergessen :-). Vielleicht findet sich ja der eine oder andere der den VHDL Code für Altera-FPGAs portiert.&lt;br /&gt;
Der eigentliche wichtige Teil eines Nachbaus ist der Codec-Teil. Dieses System verwendet zwar zwei Codecs, aber es kann auch mit einem gearbeitet werden. Als Codec kommt der TLV320AIC23B von Texas Instruments zum Einsatz. Diesen kann man als kostenloses Muster bei TI direkt bekommen. &lt;br /&gt;
Des weiteren benötigt man noch eine handvoll Bauteile wie Kondensatoren, Widerstände und einen Quarz. (Ein Codec MUSS als Master laufen, sonst hat das System keine Audio-Clocks, da diese nicht vom FPGA generiert werden)&lt;br /&gt;
Die Initialisierung des Codecs wird vom PC aus gemacht. Dazu dienen die 4 GPO-Leitungen auf dem B1-Verbinder. Da der Codec nur &amp;quot;halbes&amp;quot; SPI unterstüzt (man kann nur schreiben, nicht lesen) gestaltet sich die Initialisierung recht einfach.&lt;br /&gt;
Die 4 GPO-Leitungen teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* Chip-Select Codec 2&lt;br /&gt;
* Chip-Select Codec 1&lt;br /&gt;
* SPI Data Out&lt;br /&gt;
* SPI Clock&lt;br /&gt;
&lt;br /&gt;
==Audio-Prozessor (DAP)==&lt;br /&gt;
&lt;br /&gt;
[[bild:Overview dap core.JPG|thumb|500px|right]]&lt;br /&gt;
&lt;br /&gt;
Der FPGA beinhaltet in dem gesamten System einen Quasi-DSP. Quasi-DSP deshalb, da die Struktur im Gegensatz zu einem DSP bzw. Mikrocontroller keine Verzweigungen, Interrupts oder ähnliches zulässt. Der Audio-Prozessor besteht im wesentlichen aus 3 Teilen : einem Rahmen, einem SDSP (Small DSP)-Kern &lt;br /&gt;
sowie einem Utility-Kern. Beide Kerne können theoretisch parallel arbeiten, da jeder Kern einen eigenen Zustandsautomaten und einen eigenen Microcode-Speicher besitzen. Diese Möglichkeit ist allerdings noch nicht implementiert.&lt;br /&gt;
&lt;br /&gt;
Der SDSP-Kern besteht im wesentlichen aus einer MAC-Einheit, einem Speicher für Audiodaten, einem Koeffizienten-Speicher, einem Adressgenerator und mehreren Muxern, sowie dem schon angesprochenen Zustandsautomaten und dem Microcode. Weiterhin ist ein Hidden-Write- (bzw. Shadow Register) Mechanismus integriert,&lt;br /&gt;
welcher ein &amp;quot;knackserfreies&amp;quot; Aktualisieren von Koeffizienten ermöglicht. Alle diese Komponenten werden vom Microcode aus gesteuert (genau wie bei einem Mikrocontroller). Mit diesem Kern ist es möglich, Audiosignale zu bearbeiten. Zu Den Bearbeitungsmöglichkeiten zählen in erster Linie das Verändern der Lautstärke, Mischen, Filtern (Biquad) sowie Laden und Speichern von &lt;br /&gt;
Audiowerten.&lt;br /&gt;
&lt;br /&gt;
Der Utility-Kern besteht aus einem Akkumulator (für DDS), einem Shaper, einem Adressgenerator, einem Wavetable-Speicher, einem Zufallszahlengenerator, einigen Muxern, (einem Adressgenerator für SRAM, einem SRAM-Controller; diese sind allerdings nur nutzbar, wenn man das ganze mit dem ISE 6.2 synthetisiert) &lt;br /&gt;
und dem schon angesprochenen Zustandsautomaten und dem Microcode. Der Microcode steuert (genau wie beim SDSP-Kern) dabei die einzelnen Komponenten des Utility-Kerns. Dieser Kern ist für das Erzeugen von Audiosignalen zuständig, und erlaubt ein Audiosignal zu verzögern, sofern man die ISE-Version 6.2 verwendet (später dazu mehr). Als Wellenformen stehen Sägezahn, Rechteck (mit veränderbarer Pulsbreite), Rauschen sowie benutzderdefinierbare Wellenformen (Wavetable) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Der Rahmen besteht aus einem Zustandsautomaten, einem Programmspeicher, einigen Muxern, sowie einem doppelten I2S-Sender/Empfänger (für 2 Stereo Ein- und Ausgänge). In den Rahmen werden die beiden Kerne &amp;quot;eingehängt&amp;quot;. Die Kerne werden vom Programmspeicher aus mit Daten versorgt, und vom Zustandsautomaten angesteuert. Der Programmspeicher (PMEM) ist als 512x32 Bit organisiert. Das heißt, dass ein Befehl im Programmspeicher 32 Bit an Informationen enthält und der Audioprozessor max. 512 Befehle umfassen kann.&lt;br /&gt;
&lt;br /&gt;
===SDSP-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:SDSP-Struct.jpg|thumb|300px|left|Struktur des SDSP-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Der eigentliche Kern des DAPs ist die MAC-Einheit. Mit ihr werden die grundlegenden Operationen Multiplikation und Addition durchgeführt. Es ist eine 32x32-Bit-Einheit. &lt;br /&gt;
Die Funktionsweise des Kerns ist eigentlich recht einfach. &lt;br /&gt;
Die MAC-Einheit hat 2 Eingänge. Einer dieser Eingänge kann ein Audiosignal, ein Wert aus dem Audiospeicher (AMEM-BlockRAM) oder ein zuvor berechnetes Ergebnis sein. Der andere Eingang kann ein Koeffizient aus dem CMEM-BlockRAM oder eine Konstante (1.000, 0.000 oder -1.000) sein.&lt;br /&gt;
Der Ausgang (32-Bit, hart geclippt) geht auf das AMEM-BlockRAM und zum Ausgangs-Clipping. Das Ausgangsclipping schneidet das Audiosignal auf 24-Bit zurecht.&lt;br /&gt;
Die Adressen für die Speicher (AMEM und CMEM) werden im Addressgenerator erzeugt. Dieser wird von außen mit einer 8-Bit-Basis-Adresse gespeist und erzeugt einen Offset zu den Eingangsadressen. Er besitzt 2 setzbare Zähler und einige Multiplexer.&lt;br /&gt;
Alle Steuersignale der Komponenten von einem weiteren aus BlockRAM (MMEM) versorgt. Weiterhin wird von außen eine Startadresse vorgegeben. Dadurch lassen sich quasi Opcodes mit von außen vorgegeben Parametern (Adressen) aufrufen.&lt;br /&gt;
Das MMEM-BlockRAM wird nun einfach nur linear ausgelesen bis ein Stopbit gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Util-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Util-Core.jpg|thumb|300px|left|Struktur des Utility-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Beschreibung folgt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opcodes des DAP===&lt;br /&gt;
&lt;br /&gt;
Diese 32 Bit eines Befehls teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* 4 Bit = Opcode (für SDSP und Utility Kern gleich)&lt;br /&gt;
* 2 Bit = noch leer&lt;br /&gt;
* 1 Bit = Core Select (SDSP oder Utility)&lt;br /&gt;
* 1 Bit = Ende des Programms&lt;br /&gt;
* 4 Bit = Eingangsrouting (Kanal 1 - 4, Ergebnis SDSP-Kern, Ergebnis Utility-Kern)&lt;br /&gt;
* 4 Bit = Ausgangsrouting (SDSP-Ausgang auf Kanal 1-4, Utility-Ausgang auf Kanal 1-4)&lt;br /&gt;
* 8 Bit = Adresse 1 (bei SDSP für Audio-Memory, bei Utility-Kern für Datenspeicher)&lt;br /&gt;
* 8 Bit = Adresse 2 (bei SDSP für Koeffizientenspeicher, bei Utility-Kern unbenutzt)&lt;br /&gt;
&lt;br /&gt;
Das Eingangsrouting bestimmt, mit welchem Signal der gewählte Kern arbeiten soll. Dies können die Eingänge 1-4 aber auch ein vorher berechnetes Ergebnis des SDSP- bzw. Utility-Kerns sein. Das Ausgangsrouting bestimmt, von welchem Kern das Signal auf welchen Ausgang geroutet wird.&lt;br /&gt;
&lt;br /&gt;
Die Opcodes des DAPs sind:&lt;br /&gt;
&lt;br /&gt;
SDSP-Kern:&lt;br /&gt;
* Biquad rechnen&lt;br /&gt;
* Audiowert speichern&lt;br /&gt;
* Audiowert laden&lt;br /&gt;
* Move eines Wertes im Audiospeicher&lt;br /&gt;
* Summe rücksetzen&lt;br /&gt;
* Eingang zu Summe addieren&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe addieren&lt;br /&gt;
* Eingang zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Lautstärke &lt;br /&gt;
&lt;br /&gt;
Utility-Kern:&lt;br /&gt;
* Oszillator (DDS-Teil)&lt;br /&gt;
* Waveshaper&lt;br /&gt;
* Verzögerung&lt;br /&gt;
&lt;br /&gt;
Der Ablauf eines Audio-Programms ist folgender:&lt;br /&gt;
&lt;br /&gt;
Sobald ein neues Sample anliegt, wird die Abarbeitung des Programms von Adresse 0x0000 an im PMEM angestoßen. Es wird dabei jeweils ein Befehl geladen und Daten wie Opcode und Adressen liegen dabei an beide Kernen gleichermaßen an. Ist das Programm-Ende-Bit nicht gesetzt, so wird der jeweilige Kern (mit dem im Opcode angegeben Routing) angesteuert. Legt der betreffende Kern sein Ready-Signal auf 1, so wird der nächste Befehl abgearbeitet. Dieses Verhalten (Laden und Verteilen von Opcode-Daten sowie die Ablaufsteuerung, also das Ansteuern des Programms, Ansteuern der einzelnen Kerne, warten auf dessen Abarbeitung und das Programmende) wird vom Rahmen übernommen.&lt;br /&gt;
&lt;br /&gt;
===Speicherorganisation===&lt;br /&gt;
&lt;br /&gt;
Alle Speicher die vom DAP angesprochen werden, haben eine Wortbreite von 32 Bit, der Zugriff erfolgt aber ausschließlich über eine Breite von 8 Bit (Interface).&lt;br /&gt;
&lt;br /&gt;
DAP&lt;br /&gt;
* Programmspeicher 	(PMEM)   0x0000 - 0x07ff&lt;br /&gt;
&lt;br /&gt;
SDSP&lt;br /&gt;
* Audiospeicher   	(AMEM)   von außen nicht zugänglich&lt;br /&gt;
* Koeffizientenspeicher 	(CMEM)   0x2000 - 0x2023  (man &amp;quot;sieht&amp;quot; nur den Hidden Write -&amp;gt; später mehr dazu)&lt;br /&gt;
* Microcodespeicher      (MMEM)   0x4000 - 0x47ff&lt;br /&gt;
&lt;br /&gt;
Utility-Core&lt;br /&gt;
* Datenspeicher          (DMEM)   0x6000 - 0x67ff&lt;br /&gt;
* Wavetable-Speicher      (WMEM)   0x8000 - 0x87ff&lt;br /&gt;
* Microcodespeicher      (UMEM)   0xa000 - 0xa7ff&lt;br /&gt;
&lt;br /&gt;
===Hidden-Write===&lt;br /&gt;
Um bei Änderung der Koeffizienten Knackser zu vermeiden (die dadurch entstehen das der Koeffizient nur teilweise [durch 8-Bit-Zugriffe] geändert wird, währenddessen aber Audio trotzdem noch &amp;quot;weiterläuft&amp;quot; und mit &amp;quot;falschen&amp;quot; Zwischenwerten gerechnet wird), ist ein Mechanismus implementiert, der die zu ändernden Koeffizienten im Hintergund in den Speicher schreibt. Um diesen Mechanismus zu nutzen, müssen zuerst die Koeffizienten in interne Register&lt;br /&gt;
geschrieben werden. Die Register (es sind 8 32-Bit-Register) liegen im Speicherbereich 0x2000 bis 0x201f. Die Speicherstelle 0x2020 gibt die Startadresse innerhalb des Koeffizientenspeichers an. Diese Adresse ist nur 8 Bit breit. Die Speicherstelle 0x2021 gibt an, wieviele der 8 Register übertragen werden sollen. Die Speicherstelle 0x2022 löst den Kopiervorgang aus. Hier reicht es, ein Dummy-Byte zu schreiben. Um den Kopiervorgang zu beenden (MUSS GEMACHT WERDEN!, sonst können keine weiteren Koeffizientenupdates gemacht werden), schreibt man an Speicherstelle 0x2023 ebenfalls ein Dummy-Byte.&lt;br /&gt;
&lt;br /&gt;
===I/O Register===&lt;br /&gt;
&lt;br /&gt;
Es gibt noch einen 8-Bit breiten Adressbereich innerhalb des DAPs, mit dem der I2S-Teil stummgeschaltet werden kann. Weiterhin hat man die Möglichkeit, die Anzahl der Systemtakte pro Sample und die Anzahl der aktiven Systemtakte (also die Zeit die der Audioprozessor beschäftigt ist) zu ermitteln. Dadurch lässt sich eine Auslastungsanzeige des DAPs realisieren.&lt;br /&gt;
&lt;br /&gt;
===Interface===&lt;br /&gt;
&lt;br /&gt;
Um von außen nun ein Programm (bzw. Koeffizienten und Daten) zu laden, ist eine einfach zu handhabende und erweiterbare Schnittstelle implementiert. Die Schnittstelle kann per RS232 (fest eingestellt auf 115,2kBaud) oder per SPI (wird hardwaremäßig eingestellt) angesteuert werden. Die Schnittstelle in ihrer Gesamtheit ist schichtweise aufgebaut und beginnt mit einem Daten-Dispatcher. Dieser Daten-Dispatcher entscheidet (nachdem dieser selektiert wurde) mit dem ersten Byte, an welches angeschlossene Gerät der weitere Datenstrom geleitet wird.&lt;br /&gt;
&lt;br /&gt;
Als angeschlossene Geräte sind im aktuellen Entwurf ein Gerät namens &amp;quot;StdIO&amp;quot; und der Audioprozessor verfügbar.&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;StdIO&amp;quot;-Gerät steuert die 7-Segment-Anzeige (16-Bit-Hexadezimalanzeige oder 32-Bit-Einzelsegmentanzeige) sowie die 8 Leuchtdioden, und erlaubt es, die 3 Drucktaster sowie die 8 Schiebeschalter auszulesen.&lt;br /&gt;
&lt;br /&gt;
Der Audioprozessor besteht (schnittstellenseitig) nur aus einer Speicherzugriffsschnittstelle. Diese Schnittstelle entscheidet mit dem ersten Byte (sobald es selektiert wurde), ob in den Speicher geschrieben, von diesem gelesen, ein I/O-Schreib- oder -Lesezugriff erfolgen soll.&lt;br /&gt;
Die folgenden 2 Bytes (im Falle eines I/O-Zugriffs nur 1 Byte) bestimmen die Adresse und damit den Speicherbereich des Audioprozessors, auf den zugegriffen werden soll. Die Speicherschnittstelle besitzt einen Autoinkrementierer,&lt;br /&gt;
mit dem fortlaufende Bytes einfach hintereinander geschrieben werden können, ohne dass jedes mal wieder der FPGA, das Gerät und die neue Adresse neu geschrieben werden müssen, was den Zugriff erheblich beschleunigt.&lt;br /&gt;
&lt;br /&gt;
Ursprünglich basierte das System auf einem SPI-Interface. Dabei wurde die Chip-Select-Leitung als &amp;quot;globaler&amp;quot; Interface-Reset betrachtet, d.h. war die Leitung auf High, war der FPGA deselektiert und und alle Interface-Zustandsautomaten wurden im Reset gehalten. Erst mit dem Setzen dieser Leitung wurde der FPGA angesprochen. (erstes Byte -&amp;gt; Daten-Dispatcher, folgende Bytes gehen an das ausgewählte Gerät). Weiterhin hat SPI die Eigenschaft, dass mit jedem gesendeten Byte auch eines empfangen wurde. Der Umstand, dass RS232 weder eine Chip-Select Leitung benötigt noch eine synchrone Übertragung erzwingt, führt zu dem Umstand, dass man bei Nutzung von RS232 einige Befehle zusätzlich benötigt. Diese Befehle werden durch das Zeichen 0x1b (ESC) eingeleitet. Soll statt der &amp;quot;Spezialfunktion&amp;quot; das Byte 0x1b übertragen werden, so wird dieses einfach erneut gesendet. Soll die Chip-Select-Leitung gesetzt bzw. gelöscht werden, so wird die Sequenz 0x1b 0x00 (Selektieren) bzw.&lt;br /&gt;
0x1b 0x01 (Deselektieren) gesendet. Soll ein zuvor im Ausgangsregister gesetztes Byte gesendet werden, so muss die Sequenz 0x1b 0x02 gesendet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
0x121b auf dem 7-Segment-Display per RS232 anzeigen:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x00      (Hi-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x12      (Wert 12)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x01      (Lo-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x1b 0x1b (Wert 1b -&amp;gt; zu beachten: wenn der Wert 0x1b übertragen werden soll, muss dieser doppelt gesendet werden !!)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Beispiel, um in den Programmspeicher des Audioprozessors an Adresse 0x0010 das Langwort 0x12233445 zu schreiben:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf1      (DAP selektieren)&lt;br /&gt;
*- 0x00      (Speicher schreiben)&lt;br /&gt;
*- 0x00      &lt;br /&gt;
*- 0x10      (Adresse 0x0010 -&amp;gt; PMEM-Adresse 0x010)&lt;br /&gt;
*- 0x12	    (Adresse 0x0010 -&amp;gt; 0x12)	&lt;br /&gt;
*- 0x23	    (Adresse 0x0011 -&amp;gt; 0x23, autoincrement)&lt;br /&gt;
*- 0x34      (Adresse 0x0012 -&amp;gt; 0x34, autoincrement)&lt;br /&gt;
*- 0x45      (Adresse 0x0013 -&amp;gt; 0x45, autoincrement)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Auslesen der 8 Schalter:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x04      (Schalter auslesen)&lt;br /&gt;
*- 0x00	    (dummy byte -&amp;gt; überträgt Schalterstellung in Ausgaberegister)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man die 8 Schalterstellungen binärcodiert)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Der Datendispatcher (welcher mit dem ersten Byte nach dem Selektieren des FPGAs [0x1b 0x00] angesprochen wird) hat weiterhin einige nützliche Funktionen, die in ihrer Gesamtheit allerdings noch nicht ausführlich getestet wurden. Darunter sind Funktionen, mit denen Informationen über die an den Ports des Daten-Dispatchers angeschlossenen Geräte zu ermitteln. Diese Funktion kann dazu genutzt werden, um zu ermitten, welche Geräte im FPGA implementiert sind und an welchen Ports welche Geräte angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
Anzahl der Ports des Daten-Dispatchers liefern:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xed      (Anzahl Ports lesen)&lt;br /&gt;
*- 0x00      (dummy byte -&amp;gt; überträgt Inhalt des Ausgaberegisters)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man 0x22)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
===DAP-Modul-Schnipsel===&lt;br /&gt;
&lt;br /&gt;
Um mal &amp;quot;eben&amp;quot; mit dem DAP zu spielen, ein paar Schnipsel die sich recht leicht zu kompletten Funktionsblöcken zusammenschließen lassen.&lt;br /&gt;
Es werden hier nur die RS232-Sequenzen mit einer kurzen Erklärung aufgelistet.&lt;br /&gt;
&lt;br /&gt;
*Dual Mono Biquad&lt;br /&gt;
&lt;br /&gt;
*ESC 0x00 - FPGA selektieren&lt;br /&gt;
*0xF1     - DAP auswählen&lt;br /&gt;
*0x00 0x00 0x00 - Memory Write (Adresse 0x0000 -&amp;gt; Program Memory)&lt;br /&gt;
*0x10 0x00 0x00 0x08 - Biquad mit Kanal 1 (0) rechnen (AMEM = 0x00;CMEM = 0x08) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x10 0xf0 0x08 0x10 - Biquad mit vorherigem Ergebnis (0xf) rechnen (AMEM = 0x08; CMEM = 0x10) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x01 0x00 0x00 0x00 - Audioprogramm Ende (wichtig !!!)&lt;br /&gt;
*ESC 0x01 - DAP &amp;amp; FPGA deselektieren&lt;br /&gt;
&lt;br /&gt;
Erklärung :&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Opcodes 0x100008 deutet an, dass ein Biquad durchgerechnet werden soll. Das Eingangsregister 0 bedeutet, dass Kanal 1 des 1. Codecs verwendet wird. Das Ausgangsregister, welches nach Fertigstellung des Ergebnisses benutzt werden soll, ist 0 (-&amp;gt; Kanal 1 des 1. Codecs). Der Teil 0x00 0x08 bedeutet hierbei, dass die Biquad-Koeffizienten im CMEM ab Adresse 0x08 stehen. Die Audio-Zwischenwerte werden in den Audiospeicher AMEM ab Adresse 0x00 gelegt.&lt;br /&gt;
Der zweite Opcode (0x10f00810) rechnet ebenfalls ein Biquad durch. Nur dass hier statt Kanal 1 des Codecs das voher vom SDSP berechnete Ergebnis verwendet werden soll (Kanal 0xf, wenn man so will). Ausgangsregister ist auch hier wieder Kanal 1. Da dieser Biquad unabhängig vom ersten (d.h. mit anderen Parametern) gerechnet werden soll, sind hier logischerweise auch andere Adressen für AMEM (0x08) und CMEM (0x10) angegeben. Die CMEM-Adresse ist dabei etwas unkritischer, da es ja durchaus sein kann, dass ein Audiosignal zweimal mit den selben Biquad-Werten gerechnet werden soll, bzw. unterschiedliche Kanäle mit den selben Biquad-Werten, z.b. bei einem Stereo-Equalizer. Kritischer ist allerdings die Verwendung der AMEM-Adresse. Diese sollte für jede Operation (sofern AMEM denn verwendet wird) unterschiedlich sein, vor allem bei der Berechnung von Biquads. Dies hat den Grund, dass bei Operationen, die dieselben AMEM Adressen haben, die vorher berechneten Werte überschrieben werden. Dies ist bei Biquads gaanz böse (kann u.U. SEHR laut werden), und vom Ergebnis her nicht vorhersagbar.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
[[bild:Fpga_ext_board_schematic_no_uc.JPG|thumb|500px]]&lt;br /&gt;
&lt;br /&gt;
Wie Eingangs erwähnt, benötigt das System eine (bzw. zwei) Audio-Codecs. Im aktuellen Schaltplan wird auf einen Mikroprozessor verzichtet. Dieser diente im System primär zu Initialisierung der Codecs. Dieser Vorgang kann nun vom PC aus gesteuert werden, da in der neuen ISE-6.2-Version 4 Leitungen herausgeführt wurden, welche per RS232 gesetzt und gelöscht werden. &lt;br /&gt;
Wer das System nachbauen möchte, kann entweder die TLV320AIC23B-Codecs oder auch beliebige andere Codecs verwenden, solange einer als Master und der andere als Slave arbeitet und beide auf den I2S-Modus mit 64FS und 20-Bit-Wortlänge eingestellt sind. Die Initialisierung dieser Codecs muss dann aber separat vorgenommen werden (wobei man dann wahrscheinlich nicht um einen uC drumrum kommt). Um das System zu testen (Programme und Koeffizienten in den DAP einzuspielen), wird lediglich eine serielle Schnittstelle verwendet. Wer will, kann aber genausogut den SPI-Modus verwenden und den DAP direkt von einem Mikrocontroller aus steuern. Zur Auswahl der verwendeten Schnittstelle (RS232 oder SPI) wird Pin 13 des B1-Connectors benutzt. Liegt dieser Pin auf GND, so wird der FPGA per RS232 gesteuert. Liegt dieser Pin auf 3.3V, so wird der FPGA per SPI gesteuert.&lt;br /&gt;
&lt;br /&gt;
Hier der Schaltplan meines verwendeten Audio-Boards.&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier noch die Pinbelegung des B1-Erweiterungssteckers:&lt;br /&gt;
&lt;br /&gt;
*01 GND&lt;br /&gt;
*02 VCC 5V&lt;br /&gt;
*03 VCC 3.3V&lt;br /&gt;
*04 N.C.&lt;br /&gt;
*05 SPI_CS - Chip Select (von uC nach FPGA)&lt;br /&gt;
*06 N.C.&lt;br /&gt;
*07 SPI_DI - SPI Data In (von uC nach FPGA)&lt;br /&gt;
*08 BCLK - Bit Clock (von Master Codec)&lt;br /&gt;
*09 SPI_CLK - SPI Clock (von uC nach FPGA)&lt;br /&gt;
*10 LRCLK - LR-Clock (von Master Codec)&lt;br /&gt;
*11 SPI_DO - SPI Data Out (von FPGA nach uC)&lt;br /&gt;
*12 SDOUT1 - zum D/A Wandler (Codec) 1&lt;br /&gt;
*13 IF_SEL - Interface Select (GND = RS232; VCC3.3 = SPI)&lt;br /&gt;
*14 SDIN1 - vom A/D Wandler (Codec) 1&lt;br /&gt;
*15 RXD_OUT - RS232 Signal vom MAX232 zum uC&lt;br /&gt;
*16 SDIN2 - vom A/D Wandler (Codec) 2&lt;br /&gt;
*17 TXD_IN - RS232 Signal vom uC zum MAX232&lt;br /&gt;
*18 SDOUT2 - zum D/A Wandler (Codec) 2&lt;br /&gt;
*19 GPO 3 - Chip-Select Codec 2&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 2 - Chip-Select Codec 1&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 1 - SPI-Data out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 0 - SPI-Clock Out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
&lt;br /&gt;
==Nexys Board==&lt;br /&gt;
&lt;br /&gt;
Im SVN Repository (s.u.) gibt es eine Version des DAPs für das Nexys Board.&lt;br /&gt;
Diese ist voll SW-Kompatibel zum alten Spartan 3 Board (allerdings z.Z. nur über RS232 steuerbar). Neu bei der Version ist das das Speicherinterface generisch ausgelegt wurde und ein einfacher SRAM-Controller für das Nexys Board PSDRAM geschrieben wurde. Durch das generische Interface ist es möglich andere Speicherarten anzubinden. Der verwendete Codec ist wie schon im bisherigen Projekt der TLV320AIC23B. Dieser wird via RS232 (6-pin Port A des Nexys Boards) über die GPO Leitungen (6-pin Port D des Nexys Boards) initialisiert. Die eigentlichen Datenleitungen des Codecs liegen an Port B (BCLK, LRCLK, DIN, DOUT).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download des DAP als MCS-File für das Nexys-1000 Board : [[Media:Nexys_dap.zip]]&lt;br /&gt;
&lt;br /&gt;
Diese Version ist voll lauffähig (wurde mit den Demos getestet).&lt;br /&gt;
Die Pin Belegung für die RS232 und den Audio-Codec ist wie folgt :&lt;br /&gt;
&lt;br /&gt;
Header A : RS232 Schnittstelle&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Pin 1 : RxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : TxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V/5V für MAX232/MAX3232)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header B : I2S Schnittstelle für 1 Codec&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : BitClk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : L/R Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : SDIN&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : SDOUT&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V für den Codec)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header D : Codec-Konfiguration via SPI&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : Codec 2 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : Codec 1 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : Codec SPI Data&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : Codec SPI Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DAP mit selbstgelötetem FPGA-Board==&lt;br /&gt;
&lt;br /&gt;
Auf einen Beitrag von Thomas Pototschnig hin bin ich auf sein selbstentworfenes Spartan-3-FPGA-Board (Grafikkarte) aufmerksam geworden. Thomas hat mir die Erlaubnis gegeben dieses Board für den DAP verwenden zu können und die Schaltpläne hier zu veröffentlichen. Nachdem ich von ihm noch einige Vorversionen (nur die Platinen) ergattern konnte und diese erfolgreich aufgebaut (mit Spartan 3-200 und -400) habe, bin ich von diesem Board echt begeistert. Danke nochmals.&lt;br /&gt;
&lt;br /&gt;
[[Bild:FPGA-Board.jpg|thumb|300px|left]]&lt;br /&gt;
&lt;br /&gt;
Hier Schaltplan und Layout. &lt;br /&gt;
&lt;br /&gt;
[[Media:miniFPGA-Board.zip]]&lt;br /&gt;
&lt;br /&gt;
Das Board ist zweiseitig und die &amp;quot;schlimmsten&amp;quot; zu lötenden Bauteile sind lediglich der FPGA (QFP-144) und die beiden RAMs (SOJ36, ekelig). Der Rest ist recht einfach. Auch die Inbetriebnahme des Boards gestaltete sich problemlos.&lt;br /&gt;
&lt;br /&gt;
Den Quellcode für den DAP musste ich etwas ändern und abspecken. Durch den ineffizienten VHDL-Code der MAC-Einheit gestaltete es sich schwierig, den Entwurf synthetisierbar zu machen. Das Synthetisieren auf einem FT256 gestaltete sich einfacher. Hier ist noch dergestalt Handlungsbedarf, dass die MAC-Einheit überarbeitet werden muss. &lt;br /&gt;
Der abgespeckte Entwurf läuft auf dem FPGA-Board mit einem Spartan 3-400 sowie auf einem Spartan 3-200. &lt;br /&gt;
Den Audio-Codec, das FPGA Board, einen AVR und noch etwas IO-Kram habe ich auf eine Lochrasterplatine aufgebaut. Was noch fehlt, sind MIDI- und SD/MMC-Karten-Schnittstellen. Dann hat man eine schöne Plattform für Synthesizer und Effektgeräte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anmerkung==&lt;br /&gt;
&lt;br /&gt;
Da, wie schon gesagt, das Projekt komplett auf meinem &amp;quot;Mist&amp;quot; gewachsen ist, wird es wohl noch eine Weile dauern, bis alles, was den DAP betrifft, hier in diesem Artikel (und auch in einem Dokumentations-PDF) eingearbeitet ist. Ich werde (sofern ich Zeit dazu habe) noch ein Delphi-Programm mit Sourcecode einstellen, welches den DAP richtig nutzbar macht, so dass man dann direkt damit &amp;quot;spielen&amp;quot; kann. Eine umfangreiche und vollständige Dokumentation würde momentan einfach zu viel Zeit in Anspruch nehmen, und ich möchte langsam das Projekt vorstellen, um Anregung, Kritik und Verbesserungsvorschläge ernten zu können. Ich hoffe, weitere Leute zu finden, um diesem Projekt noch mehr Leben und Möglichkeiten einhauchen zu können.&lt;br /&gt;
&lt;br /&gt;
==Fotos==&lt;br /&gt;
&lt;br /&gt;
Ursprüngliche Version:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Gesamt_wo_uc.jpg|thumb|200px|left|Spartan.3-Board und Expansion-Board]]&lt;br /&gt;
[[Bild:Codecs.jpg|thumb|200px|left|Expansion Board]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nexys-Board:&lt;br /&gt;
[[Bild:dap_nexys_v1.jpg|thumb|200px|left|Nexys-Board mit 1 Audio-Codec]]&lt;br /&gt;
[[Bild:Nexys-board-gesamt.jpg|thumb|200px|left|Nexys-Board mit Lochraster-Board und 2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
[[Bild:Nexys-board-codecs-1.jpg|thumb|200px|left|2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufbau von [[Benutzer:Andreas]]:&lt;br /&gt;
[[Bild:Nexys-Audio-DSP-Foto-Andreas.jpg|thumb|600px|left|Nexys + Breadboard + 1 [[Audio Codec Board]]]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Synth-gesamt-klein.jpg|thumb|500px|left|Aufbau des DAPs mit FPGA-Board (entworfen von Thomas Pototschnig) auf Lochraster an AVR, Codec und weiterer IO]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap-Synth-01.jpg|thumb|300px|left|Synth Board. DAP mit AVR,Codec, MIDI-Interface, RS232 (schaltbar) und LCD]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_Ansicht_02.jpg|thumb|300px|left|Synth Board. Komplettansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_klein_3.jpg|thumb|600px|left|Synth Board. Synth-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Oben.jpg|thumb|300px|left|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Unten.jpg|thumb|300px|right|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Träger-und-Mainboard.jpg|thumb|600px|left|Selbstgeroutetes DAP-Board auf Trägerplatine]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Seite.jpg|thumb|300px|left|DAP-Board mit Touch-Display Seitenansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display.jpg|thumb|600px|left|DAP-Board mit Touch-Display]]&lt;br /&gt;
&lt;br /&gt;
Diese Version des DAP hat ein Grafikdisplay incl. Touchpanel. Die Ansteuerung übernimmt der FPGA. Dort ist einer kleiner &amp;quot;Grafik-Prozessor&amp;quot; integriert, der das Update des Displays und das Kopieren der Bitmaps übernimmt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synthesizer Ansicht 1.jpg|thumb|600px|left|]]&lt;br /&gt;
Synth-Board. Komplettansicht in einem Cherry-Tastaturgehäuse (wie dafür gemacht :-)) im Synthesizer-Stil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synth Komplett.jpg|thumb|600px|left|Fertige Version des DAP als Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
Der komplette Synthesizer mit schicker Frontplatte und passendem (oben schon erwähnten :-)) Cherry-Tastatur-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Version 1.5.jpg|thumb|600px|left|Heue Hardwareversion der DAP-Hauptplatine]]&lt;br /&gt;
&lt;br /&gt;
Diese Version beinhaltet folgendes : :-) &lt;br /&gt;
&lt;br /&gt;
 - Xilinx XC3S400&lt;br /&gt;
 - ATmega2561&lt;br /&gt;
&lt;br /&gt;
 - 16 MByte (8Mx16) SDRAM&lt;br /&gt;
 - µSD Card Slot&lt;br /&gt;
 - AT45DB321 DataFlash&lt;br /&gt;
 - 24C512 EEProm&lt;br /&gt;
&lt;br /&gt;
 - TLC320AI23B Audio Codec mit Kopfhörer Ausgang&lt;br /&gt;
 - CS5343 A/D Wandler&lt;br /&gt;
 - CS4344 D/A Wandler&lt;br /&gt;
&lt;br /&gt;
 - MIDI&lt;br /&gt;
 - RS232&lt;br /&gt;
 - etlichen IO-Pins vom AVR und FPGA&lt;br /&gt;
 - 2 separaten Clock-Oszillatoren (nicht bestückt)&lt;br /&gt;
&lt;br /&gt;
... und weiterem Kleinkram (Level-Shifter, LDO, Platform-Flash, usw ... und vielen 100nF-Kondensatoren)&lt;br /&gt;
&lt;br /&gt;
Ideal zum Aufbau einer Audioplattform. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audio-Demos==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein EQ-Demo mit rosa Rauschen. Klingt wie eine Meeresbrandung.&lt;br /&gt;
&lt;br /&gt;
[[Media:eq_demo1.zip]]&lt;br /&gt;
&lt;br /&gt;
Der DAP als Synth. Der DAP wird komplett vom PC aus gesteuert (Hüllkurve, Sequencer und Filterberechnung werden im PC gemacht).&lt;br /&gt;
&lt;br /&gt;
[[Media:synthdemo1.wav.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MC505-Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen von meiner Roland MC505 Groovebox. Es wird einfach nur ein Werkspreset abgespielt und durch den DAP gejagt.&lt;br /&gt;
&lt;br /&gt;
* [[Media:mc505-eq-demo.wav.zip|EQ-Demo]]&lt;br /&gt;
* [[Media:mc505-filter-demo.wav.zip|Filter-Demo (Tiefpass/Hochpass/Notch)]]&lt;br /&gt;
* [[Media:mc505-delay-demo.wav.zip|Delay-Demo (137BPM [657ms &amp;amp; 876 ms]/Chorus)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Synth-Board Audio-Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen vom DAP in Verbindung mit einem AVR, der die Filterkoeffizientenberechnung sowie eine komplette Synthesizersteuerung beinhaltet, also quasi einen Synthesizer aus dem DAP macht (inkl. MIDI-Steuerung).&lt;br /&gt;
&lt;br /&gt;
MIDI-Sequenz und Tiefpassfilter (Filter und Modulation über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-01.mp3]]&lt;br /&gt;
&lt;br /&gt;
Dieselbe MIDI-Sequenz mit Hochpassfilter (Filter und Modulation ebenfalls über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-02.mp3]]&lt;br /&gt;
&lt;br /&gt;
Eine eher Techno-ähnliche Demo, welche die Auflösung des Systems (DAP+AVR+MIDI) ein wenig zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap_syn_demo_03.mp3]]&lt;br /&gt;
&lt;br /&gt;
==Delphi Tools==&lt;br /&gt;
&lt;br /&gt;
Um den DAP nutzbar zu machen benötigt man entweder ein uC Programm oder ein PC Programm. Da das verwenden von PC-Programmen einfacher fürs Spielen und Experimentieren ist, werde ich hier im Laufe der Zeit kleine Demo-Programme aber auch komplette Front-Ends für den DAP reinstellen. Die Delphi-Programme sind allesamt in Turbo-Delphi geschrieben und die dazugehörigen Quellcodes werden ebenfalls im Laufe der Zeit geuploaded. Ich werde allerdings zuerst noch das Feature des Konfigurierens der Codecs vom PC aus einbauen. &lt;br /&gt;
Nachtrag zum Konfigurieren des Codecs : Prinzipiell funktioniert es, allerdings ist das mit häßlichen Nebengeräuschen verbunden, da ich bei jeder Änderung der Lautstärke im Codec, diesen auch Resetten muß, da sonst immer beide Codecs beschrieben werden, was unschön ist. Warum dies so ist kann ich leider nicht sagen, da ich keine Möglichkeit habe die SPI-Leitungen mitzusniffen (bräuchte dafür einen kleinen LA, den ich nicht habe). &lt;br /&gt;
&lt;br /&gt;
* Demo eines 3 Band Stereo Equalizers. (Der Knopf &amp;quot;MoveIt!&amp;quot; bringt Leben ins Demo): [[Media:dap_eq_demo.zip]]&lt;br /&gt;
* Demo eines 4 Kanal Mono Mixers mit Monitor (Vorhör)-Ausgang: [[Media:dap_mix_demo.zip]]&lt;br /&gt;
* Demo eines Synthesizer-Filters: [[Media:dap_filter_demo.zip]]&lt;br /&gt;
* Demo eines 2 Kanal Delays (Der Button &amp;quot;MoveIt!&amp;quot; macht daraus einen Chorus :-))): [[Media:dap_delay_demo.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Quellcodes für das EQ-Demo, das Filter-Demo und das Delay-Demo : [[Media:dap_demos_plus_delphi_source.zip]]&lt;br /&gt;
&lt;br /&gt;
Es folgen noch der Quellcode für den Mischer (hab ich gerade nicht zur Hand) und weitere Demos (ein Synthesizer und eine 4x4 Patchbay mit EQ und was mir sonst noch einfällt. Dann natürlich mit Source-Codes).&lt;br /&gt;
Anhand dieser Beispiele wird auch eine grobe Doku erstellt.&lt;br /&gt;
&lt;br /&gt;
== SVN-Repository ==&lt;br /&gt;
&lt;br /&gt;
 svn co svn://mikrocontroller.net/audiodsp&lt;br /&gt;
&lt;br /&gt;
Ein automatisch aktualisiertes Paket mit den Daten aus dem Repository gibt es unter http://www.mikrocontroller.net/download/audiodsp-snapshot.tar.gz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
&lt;br /&gt;
* 12.07.2007: Es wurde ein generisches Speicherinterfaces welches Wartezyklen im DAP erlaubt implementiert. Dadurch kann man auf die jeweilgen Speicher des Boards eingehen. Z.Z. ist nur ein einfaches Speicherinterface für den asynchronen Betrieb des PSDRAM des Nexys Boards implementiert. Das Interface ermögicht es einen RAM Controller anzuschließen welcher z.&amp;amp;nbsp;B. ein quasi-Multiport RAM darstellt. Getestet wurde der Stand mit dem Nexys-1000 Board.&lt;br /&gt;
&lt;br /&gt;
==To do==&lt;br /&gt;
&lt;br /&gt;
* nähere Zukunft&lt;br /&gt;
** Einen Konfigurationsdialog in die Demo-Programme einarbeiten mit denen man mit den Codecs etwas spielen kann (Line-In Level, Mikrofon-Level, Bypass, Head-Phone Volume) tlw. erledigt. Funktioniert aber nicht richtig, und daher noch nicht eingebaut. Quellcodes dazu sind vorhanden.&lt;br /&gt;
** Doku anhand der Demo-Programme erstellen&lt;br /&gt;
** C-Code schnipsel erstellen&lt;br /&gt;
&lt;br /&gt;
* fernere Zukunft&lt;br /&gt;
** Front-End des DAPs machen, mit dem sich DAP-Programme erstellen lassen, der Koeffizienten-, Daten- und Wellenform-Speicher beschrieben und gelesen werden kann, der Mikro-Code editierbar gemacht wird und noch ein paar Sachen mehr machbar sind&lt;br /&gt;
** weitere Module für den Rahmen (HDD-Core, weitere Routing-Möglichkeiten innerhalb der bisherigen Cores SDSP und Util)&lt;br /&gt;
&lt;br /&gt;
==Diskussion==&lt;br /&gt;
* http://www.mikrocontroller.net/topic/65205&lt;br /&gt;
* http://www.mikrocontroller.net/topic/34376&lt;br /&gt;
&lt;br /&gt;
Falls Interesse an einer Sammelbestellung für die Platinen und Bauteile besteht &lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/144288&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]] &lt;br /&gt;
[[Kategorie:Audio]]&lt;br /&gt;
[[Kategorie:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66882</id>
		<title>Audio-DSP mit Spartan 3-FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66882"/>
		<updated>2012-06-14T22:06:08Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* Fotos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [[Benutzer:TheMason]]&lt;br /&gt;
&lt;br /&gt;
==Ziel==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projekts ist es, eine FPGA-basierte Plattform aufzubauen mit der es möglich ist Synthesizer, Effektgeräte, Mischpulte  oder gar ein Harddiskrecording-System zu realisieren.&lt;br /&gt;
&lt;br /&gt;
==Feature-Liste==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften des Audio-Prozessors: &lt;br /&gt;
&lt;br /&gt;
* Oszillatoren&lt;br /&gt;
* Biquads (Filter)&lt;br /&gt;
* Addierer, Schalter, Verstärker (Multiplizierer)&lt;br /&gt;
* Delays&lt;br /&gt;
* Steuerung des Audio-Prozessors via SPI oder RS232&lt;br /&gt;
* 4 Mono Ein- und Ausgänge&lt;br /&gt;
* GPO (General Purpose Outputs) zur Konfiguration der Codecs&lt;br /&gt;
&lt;br /&gt;
==Übersicht==&lt;br /&gt;
[[Bild:Overview_wo_uc.jpg|thumb|500px]]&lt;br /&gt;
Basis des Audio-Systems ist das Xilinx Spartan 3-Development Board. An diesem Board werden 2 Audio-Codecs angschlossen von denen einer als Master und der andere als Slave agiert. Optional kann noch ein Mikrocontroller angeschlossen werden welcher den FPGA per SPI steuert. Da dieses Projekt mittlerweile recht umfangreich geworden ist, kann ich hier nur einen kurzen Umriss des Systems geben. Dabei beschränke ich mich auf die grobe Funktionsweise des Audio-Prozessors, erläutere das Interface (welches ich als Basis für weitere Projekte bereits nutze) und gebe einen kleinen Überblick über die Hardware.&lt;br /&gt;
&lt;br /&gt;
Das System kann (sofern man 2 Audio-Codecs, von denen einer als Master, der andere als Slave arbeitet, angeschlossen und konfiguriert hat) direkt genutzt werden, da der DAP per RS232 gesteuert werden kann. Der Audio-Prozessor startet mit einem Stereo-Tiefpass-Filter der sich auf den ersten Codec bezieht,&lt;br /&gt;
sodass man ein erstes Demo hat (selbst wenn es etwas unspektakulär ist)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nachbau==&lt;br /&gt;
&lt;br /&gt;
Wer sich dieses System nachbauen möchte, benötigt zunächst ein FPGA-Board. Mit dem Spartan-3-Board von Digilent gestaltet sich der Nachbau einfach, weil die Programmier-Dateien für den FPGA direkt für dieses Board verwendet werden können. Nutzer anderer Boards (Xilinx) müssten zuerst die UCF-Datei für die Pins ihres jeweiligen Boards anpassen, und dieses Projekt neu synthetisieren (compilieren). Nutzer von Altera-Boards hingegen müssen die BlockRAM-Instanzen auf die Altera-Architektur anpassen (den Inhalt der RAMs dabei nicht vergessen :-). Vielleicht findet sich ja der eine oder andere der den VHDL Code für Altera-FPGAs portiert.&lt;br /&gt;
Der eigentliche wichtige Teil eines Nachbaus ist der Codec-Teil. Dieses System verwendet zwar zwei Codecs, aber es kann auch mit einem gearbeitet werden. Als Codec kommt der TLV320AIC23B von Texas Instruments zum Einsatz. Diesen kann man als kostenloses Muster bei TI direkt bekommen. &lt;br /&gt;
Des weiteren benötigt man noch eine handvoll Bauteile wie Kondensatoren, Widerstände und einen Quarz. (Ein Codec MUSS als Master laufen, sonst hat das System keine Audio-Clocks, da diese nicht vom FPGA generiert werden)&lt;br /&gt;
Die Initialisierung des Codecs wird vom PC aus gemacht. Dazu dienen die 4 GPO-Leitungen auf dem B1-Verbinder. Da der Codec nur &amp;quot;halbes&amp;quot; SPI unterstüzt (man kann nur schreiben, nicht lesen) gestaltet sich die Initialisierung recht einfach.&lt;br /&gt;
Die 4 GPO-Leitungen teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* Chip-Select Codec 2&lt;br /&gt;
* Chip-Select Codec 1&lt;br /&gt;
* SPI Data Out&lt;br /&gt;
* SPI Clock&lt;br /&gt;
&lt;br /&gt;
==Audio-Prozessor (DAP)==&lt;br /&gt;
&lt;br /&gt;
[[bild:Overview dap core.JPG|thumb|500px|right]]&lt;br /&gt;
&lt;br /&gt;
Der FPGA beinhaltet in dem gesamten System einen Quasi-DSP. Quasi-DSP deshalb, da die Struktur im Gegensatz zu einem DSP bzw. Mikrocontroller keine Verzweigungen, Interrupts oder ähnliches zulässt. Der Audio-Prozessor besteht im wesentlichen aus 3 Teilen : einem Rahmen, einem SDSP (Small DSP)-Kern &lt;br /&gt;
sowie einem Utility-Kern. Beide Kerne können theoretisch parallel arbeiten, da jeder Kern einen eigenen Zustandsautomaten und einen eigenen Microcode-Speicher besitzen. Diese Möglichkeit ist allerdings noch nicht implementiert.&lt;br /&gt;
&lt;br /&gt;
Der SDSP-Kern besteht im wesentlichen aus einer MAC-Einheit, einem Speicher für Audiodaten, einem Koeffizienten-Speicher, einem Adressgenerator und mehreren Muxern, sowie dem schon angesprochenen Zustandsautomaten und dem Microcode. Weiterhin ist ein Hidden-Write- (bzw. Shadow Register) Mechanismus integriert,&lt;br /&gt;
welcher ein &amp;quot;knackserfreies&amp;quot; Aktualisieren von Koeffizienten ermöglicht. Alle diese Komponenten werden vom Microcode aus gesteuert (genau wie bei einem Mikrocontroller). Mit diesem Kern ist es möglich, Audiosignale zu bearbeiten. Zu Den Bearbeitungsmöglichkeiten zählen in erster Linie das Verändern der Lautstärke, Mischen, Filtern (Biquad) sowie Laden und Speichern von &lt;br /&gt;
Audiowerten.&lt;br /&gt;
&lt;br /&gt;
Der Utility-Kern besteht aus einem Akkumulator (für DDS), einem Shaper, einem Adressgenerator, einem Wavetable-Speicher, einem Zufallszahlengenerator, einigen Muxern, (einem Adressgenerator für SRAM, einem SRAM-Controller; diese sind allerdings nur nutzbar, wenn man das ganze mit dem ISE 6.2 synthetisiert) &lt;br /&gt;
und dem schon angesprochenen Zustandsautomaten und dem Microcode. Der Microcode steuert (genau wie beim SDSP-Kern) dabei die einzelnen Komponenten des Utility-Kerns. Dieser Kern ist für das Erzeugen von Audiosignalen zuständig, und erlaubt ein Audiosignal zu verzögern, sofern man die ISE-Version 6.2 verwendet (später dazu mehr). Als Wellenformen stehen Sägezahn, Rechteck (mit veränderbarer Pulsbreite), Rauschen sowie benutzderdefinierbare Wellenformen (Wavetable) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Der Rahmen besteht aus einem Zustandsautomaten, einem Programmspeicher, einigen Muxern, sowie einem doppelten I2S-Sender/Empfänger (für 2 Stereo Ein- und Ausgänge). In den Rahmen werden die beiden Kerne &amp;quot;eingehängt&amp;quot;. Die Kerne werden vom Programmspeicher aus mit Daten versorgt, und vom Zustandsautomaten angesteuert. Der Programmspeicher (PMEM) ist als 512x32 Bit organisiert. Das heißt, dass ein Befehl im Programmspeicher 32 Bit an Informationen enthält und der Audioprozessor max. 512 Befehle umfassen kann.&lt;br /&gt;
&lt;br /&gt;
===SDSP-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:SDSP-Struct.jpg|thumb|300px|left|Struktur des SDSP-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Der eigentliche Kern des DAPs ist die MAC-Einheit. Mit ihr werden die grundlegenden Operationen Multiplikation und Addition durchgeführt. Es ist eine 32x32-Bit-Einheit. &lt;br /&gt;
Die Funktionsweise des Kerns ist eigentlich recht einfach. &lt;br /&gt;
Die MAC-Einheit hat 2 Eingänge. Einer dieser Eingänge kann ein Audiosignal, ein Wert aus dem Audiospeicher (AMEM-BlockRAM) oder ein zuvor berechnetes Ergebnis sein. Der andere Eingang kann ein Koeffizient aus dem CMEM-BlockRAM oder eine Konstante (1.000, 0.000 oder -1.000) sein.&lt;br /&gt;
Der Ausgang (32-Bit, hart geclippt) geht auf das AMEM-BlockRAM und zum Ausgangs-Clipping. Das Ausgangsclipping schneidet das Audiosignal auf 24-Bit zurecht.&lt;br /&gt;
Die Adressen für die Speicher (AMEM und CMEM) werden im Addressgenerator erzeugt. Dieser wird von außen mit einer 8-Bit-Basis-Adresse gespeist und erzeugt einen Offset zu den Eingangsadressen. Er besitzt 2 setzbare Zähler und einige Multiplexer.&lt;br /&gt;
Alle Steuersignale der Komponenten von einem weiteren aus BlockRAM (MMEM) versorgt. Weiterhin wird von außen eine Startadresse vorgegeben. Dadurch lassen sich quasi Opcodes mit von außen vorgegeben Parametern (Adressen) aufrufen.&lt;br /&gt;
Das MMEM-BlockRAM wird nun einfach nur linear ausgelesen bis ein Stopbit gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Util-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Util-Core.jpg|thumb|300px|left|Struktur des Utility-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Beschreibung folgt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opcodes des DAP===&lt;br /&gt;
&lt;br /&gt;
Diese 32 Bit eines Befehls teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* 4 Bit = Opcode (für SDSP und Utility Kern gleich)&lt;br /&gt;
* 2 Bit = noch leer&lt;br /&gt;
* 1 Bit = Core Select (SDSP oder Utility)&lt;br /&gt;
* 1 Bit = Ende des Programms&lt;br /&gt;
* 4 Bit = Eingangsrouting (Kanal 1 - 4, Ergebnis SDSP-Kern, Ergebnis Utility-Kern)&lt;br /&gt;
* 4 Bit = Ausgangsrouting (SDSP-Ausgang auf Kanal 1-4, Utility-Ausgang auf Kanal 1-4)&lt;br /&gt;
* 8 Bit = Adresse 1 (bei SDSP für Audio-Memory, bei Utility-Kern für Datenspeicher)&lt;br /&gt;
* 8 Bit = Adresse 2 (bei SDSP für Koeffizientenspeicher, bei Utility-Kern unbenutzt)&lt;br /&gt;
&lt;br /&gt;
Das Eingangsrouting bestimmt, mit welchem Signal der gewählte Kern arbeiten soll. Dies können die Eingänge 1-4 aber auch ein vorher berechnetes Ergebnis des SDSP- bzw. Utility-Kerns sein. Das Ausgangsrouting bestimmt, von welchem Kern das Signal auf welchen Ausgang geroutet wird.&lt;br /&gt;
&lt;br /&gt;
Die Opcodes des DAPs sind:&lt;br /&gt;
&lt;br /&gt;
SDSP-Kern:&lt;br /&gt;
* Biquad rechnen&lt;br /&gt;
* Audiowert speichern&lt;br /&gt;
* Audiowert laden&lt;br /&gt;
* Move eines Wertes im Audiospeicher&lt;br /&gt;
* Summe rücksetzen&lt;br /&gt;
* Eingang zu Summe addieren&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe addieren&lt;br /&gt;
* Eingang zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Lautstärke &lt;br /&gt;
&lt;br /&gt;
Utility-Kern:&lt;br /&gt;
* Oszillator (DDS-Teil)&lt;br /&gt;
* Waveshaper&lt;br /&gt;
* Verzögerung&lt;br /&gt;
&lt;br /&gt;
Der Ablauf eines Audio-Programms ist folgender:&lt;br /&gt;
&lt;br /&gt;
Sobald ein neues Sample anliegt, wird die Abarbeitung des Programms von Adresse 0x0000 an im PMEM angestoßen. Es wird dabei jeweils ein Befehl geladen und Daten wie Opcode und Adressen liegen dabei an beide Kernen gleichermaßen an. Ist das Programm-Ende-Bit nicht gesetzt, so wird der jeweilige Kern (mit dem im Opcode angegeben Routing) angesteuert. Legt der betreffende Kern sein Ready-Signal auf 1, so wird der nächste Befehl abgearbeitet. Dieses Verhalten (Laden und Verteilen von Opcode-Daten sowie die Ablaufsteuerung, also das Ansteuern des Programms, Ansteuern der einzelnen Kerne, warten auf dessen Abarbeitung und das Programmende) wird vom Rahmen übernommen.&lt;br /&gt;
&lt;br /&gt;
===Speicherorganisation===&lt;br /&gt;
&lt;br /&gt;
Alle Speicher die vom DAP angesprochen werden, haben eine Wortbreite von 32 Bit, der Zugriff erfolgt aber ausschließlich über eine Breite von 8 Bit (Interface).&lt;br /&gt;
&lt;br /&gt;
DAP&lt;br /&gt;
* Programmspeicher 	(PMEM)   0x0000 - 0x07ff&lt;br /&gt;
&lt;br /&gt;
SDSP&lt;br /&gt;
* Audiospeicher   	(AMEM)   von außen nicht zugänglich&lt;br /&gt;
* Koeffizientenspeicher 	(CMEM)   0x2000 - 0x2023  (man &amp;quot;sieht&amp;quot; nur den Hidden Write -&amp;gt; später mehr dazu)&lt;br /&gt;
* Microcodespeicher      (MMEM)   0x4000 - 0x47ff&lt;br /&gt;
&lt;br /&gt;
Utility-Core&lt;br /&gt;
* Datenspeicher          (DMEM)   0x6000 - 0x67ff&lt;br /&gt;
* Wavetable-Speicher      (WMEM)   0x8000 - 0x87ff&lt;br /&gt;
* Microcodespeicher      (UMEM)   0xa000 - 0xa7ff&lt;br /&gt;
&lt;br /&gt;
===Hidden-Write===&lt;br /&gt;
Um bei Änderung der Koeffizienten Knackser zu vermeiden (die dadurch entstehen das der Koeffizient nur teilweise [durch 8-Bit-Zugriffe] geändert wird, währenddessen aber Audio trotzdem noch &amp;quot;weiterläuft&amp;quot; und mit &amp;quot;falschen&amp;quot; Zwischenwerten gerechnet wird), ist ein Mechanismus implementiert, der die zu ändernden Koeffizienten im Hintergund in den Speicher schreibt. Um diesen Mechanismus zu nutzen, müssen zuerst die Koeffizienten in interne Register&lt;br /&gt;
geschrieben werden. Die Register (es sind 8 32-Bit-Register) liegen im Speicherbereich 0x2000 bis 0x201f. Die Speicherstelle 0x2020 gibt die Startadresse innerhalb des Koeffizientenspeichers an. Diese Adresse ist nur 8 Bit breit. Die Speicherstelle 0x2021 gibt an, wieviele der 8 Register übertragen werden sollen. Die Speicherstelle 0x2022 löst den Kopiervorgang aus. Hier reicht es, ein Dummy-Byte zu schreiben. Um den Kopiervorgang zu beenden (MUSS GEMACHT WERDEN!, sonst können keine weiteren Koeffizientenupdates gemacht werden), schreibt man an Speicherstelle 0x2023 ebenfalls ein Dummy-Byte.&lt;br /&gt;
&lt;br /&gt;
===I/O Register===&lt;br /&gt;
&lt;br /&gt;
Es gibt noch einen 8-Bit breiten Adressbereich innerhalb des DAPs, mit dem der I2S-Teil stummgeschaltet werden kann. Weiterhin hat man die Möglichkeit, die Anzahl der Systemtakte pro Sample und die Anzahl der aktiven Systemtakte (also die Zeit die der Audioprozessor beschäftigt ist) zu ermitteln. Dadurch lässt sich eine Auslastungsanzeige des DAPs realisieren.&lt;br /&gt;
&lt;br /&gt;
===Interface===&lt;br /&gt;
&lt;br /&gt;
Um von außen nun ein Programm (bzw. Koeffizienten und Daten) zu laden, ist eine einfach zu handhabende und erweiterbare Schnittstelle implementiert. Die Schnittstelle kann per RS232 (fest eingestellt auf 115,2kBaud) oder per SPI (wird hardwaremäßig eingestellt) angesteuert werden. Die Schnittstelle in ihrer Gesamtheit ist schichtweise aufgebaut und beginnt mit einem Daten-Dispatcher. Dieser Daten-Dispatcher entscheidet (nachdem dieser selektiert wurde) mit dem ersten Byte, an welches angeschlossene Gerät der weitere Datenstrom geleitet wird.&lt;br /&gt;
&lt;br /&gt;
Als angeschlossene Geräte sind im aktuellen Entwurf ein Gerät namens &amp;quot;StdIO&amp;quot; und der Audioprozessor verfügbar.&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;StdIO&amp;quot;-Gerät steuert die 7-Segment-Anzeige (16-Bit-Hexadezimalanzeige oder 32-Bit-Einzelsegmentanzeige) sowie die 8 Leuchtdioden, und erlaubt es, die 3 Drucktaster sowie die 8 Schiebeschalter auszulesen.&lt;br /&gt;
&lt;br /&gt;
Der Audioprozessor besteht (schnittstellenseitig) nur aus einer Speicherzugriffsschnittstelle. Diese Schnittstelle entscheidet mit dem ersten Byte (sobald es selektiert wurde), ob in den Speicher geschrieben, von diesem gelesen, ein I/O-Schreib- oder -Lesezugriff erfolgen soll.&lt;br /&gt;
Die folgenden 2 Bytes (im Falle eines I/O-Zugriffs nur 1 Byte) bestimmen die Adresse und damit den Speicherbereich des Audioprozessors, auf den zugegriffen werden soll. Die Speicherschnittstelle besitzt einen Autoinkrementierer,&lt;br /&gt;
mit dem fortlaufende Bytes einfach hintereinander geschrieben werden können, ohne dass jedes mal wieder der FPGA, das Gerät und die neue Adresse neu geschrieben werden müssen, was den Zugriff erheblich beschleunigt.&lt;br /&gt;
&lt;br /&gt;
Ursprünglich basierte das System auf einem SPI-Interface. Dabei wurde die Chip-Select-Leitung als &amp;quot;globaler&amp;quot; Interface-Reset betrachtet, d.h. war die Leitung auf High, war der FPGA deselektiert und und alle Interface-Zustandsautomaten wurden im Reset gehalten. Erst mit dem Setzen dieser Leitung wurde der FPGA angesprochen. (erstes Byte -&amp;gt; Daten-Dispatcher, folgende Bytes gehen an das ausgewählte Gerät). Weiterhin hat SPI die Eigenschaft, dass mit jedem gesendeten Byte auch eines empfangen wurde. Der Umstand, dass RS232 weder eine Chip-Select Leitung benötigt noch eine synchrone Übertragung erzwingt, führt zu dem Umstand, dass man bei Nutzung von RS232 einige Befehle zusätzlich benötigt. Diese Befehle werden durch das Zeichen 0x1b (ESC) eingeleitet. Soll statt der &amp;quot;Spezialfunktion&amp;quot; das Byte 0x1b übertragen werden, so wird dieses einfach erneut gesendet. Soll die Chip-Select-Leitung gesetzt bzw. gelöscht werden, so wird die Sequenz 0x1b 0x00 (Selektieren) bzw.&lt;br /&gt;
0x1b 0x01 (Deselektieren) gesendet. Soll ein zuvor im Ausgangsregister gesetztes Byte gesendet werden, so muss die Sequenz 0x1b 0x02 gesendet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
0x121b auf dem 7-Segment-Display per RS232 anzeigen:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x00      (Hi-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x12      (Wert 12)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x01      (Lo-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x1b 0x1b (Wert 1b -&amp;gt; zu beachten: wenn der Wert 0x1b übertragen werden soll, muss dieser doppelt gesendet werden !!)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Beispiel, um in den Programmspeicher des Audioprozessors an Adresse 0x0010 das Langwort 0x12233445 zu schreiben:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf1      (DAP selektieren)&lt;br /&gt;
*- 0x00      (Speicher schreiben)&lt;br /&gt;
*- 0x00      &lt;br /&gt;
*- 0x10      (Adresse 0x0010 -&amp;gt; PMEM-Adresse 0x010)&lt;br /&gt;
*- 0x12	    (Adresse 0x0010 -&amp;gt; 0x12)	&lt;br /&gt;
*- 0x23	    (Adresse 0x0011 -&amp;gt; 0x23, autoincrement)&lt;br /&gt;
*- 0x34      (Adresse 0x0012 -&amp;gt; 0x34, autoincrement)&lt;br /&gt;
*- 0x45      (Adresse 0x0013 -&amp;gt; 0x45, autoincrement)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Auslesen der 8 Schalter:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x04      (Schalter auslesen)&lt;br /&gt;
*- 0x00	    (dummy byte -&amp;gt; überträgt Schalterstellung in Ausgaberegister)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man die 8 Schalterstellungen binärcodiert)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Der Datendispatcher (welcher mit dem ersten Byte nach dem Selektieren des FPGAs [0x1b 0x00] angesprochen wird) hat weiterhin einige nützliche Funktionen, die in ihrer Gesamtheit allerdings noch nicht ausführlich getestet wurden. Darunter sind Funktionen, mit denen Informationen über die an den Ports des Daten-Dispatchers angeschlossenen Geräte zu ermitteln. Diese Funktion kann dazu genutzt werden, um zu ermitten, welche Geräte im FPGA implementiert sind und an welchen Ports welche Geräte angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
Anzahl der Ports des Daten-Dispatchers liefern:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xed      (Anzahl Ports lesen)&lt;br /&gt;
*- 0x00      (dummy byte -&amp;gt; überträgt Inhalt des Ausgaberegisters)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man 0x22)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
===DAP-Modul-Schnipsel===&lt;br /&gt;
&lt;br /&gt;
Um mal &amp;quot;eben&amp;quot; mit dem DAP zu spielen, ein paar Schnipsel die sich recht leicht zu kompletten Funktionsblöcken zusammenschließen lassen.&lt;br /&gt;
Es werden hier nur die RS232-Sequenzen mit einer kurzen Erklärung aufgelistet.&lt;br /&gt;
&lt;br /&gt;
*Dual Mono Biquad&lt;br /&gt;
&lt;br /&gt;
*ESC 0x00 - FPGA selektieren&lt;br /&gt;
*0xF1     - DAP auswählen&lt;br /&gt;
*0x00 0x00 0x00 - Memory Write (Adresse 0x0000 -&amp;gt; Program Memory)&lt;br /&gt;
*0x10 0x00 0x00 0x08 - Biquad mit Kanal 1 (0) rechnen (AMEM = 0x00;CMEM = 0x08) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x10 0xf0 0x08 0x10 - Biquad mit vorherigem Ergebnis (0xf) rechnen (AMEM = 0x08; CMEM = 0x10) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x01 0x00 0x00 0x00 - Audioprogramm Ende (wichtig !!!)&lt;br /&gt;
*ESC 0x01 - DAP &amp;amp; FPGA deselektieren&lt;br /&gt;
&lt;br /&gt;
Erklärung :&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Opcodes 0x100008 deutet an, dass ein Biquad durchgerechnet werden soll. Das Eingangsregister 0 bedeutet, dass Kanal 1 des 1. Codecs verwendet wird. Das Ausgangsregister, welches nach Fertigstellung des Ergebnisses benutzt werden soll, ist 0 (-&amp;gt; Kanal 1 des 1. Codecs). Der Teil 0x00 0x08 bedeutet hierbei, dass die Biquad-Koeffizienten im CMEM ab Adresse 0x08 stehen. Die Audio-Zwischenwerte werden in den Audiospeicher AMEM ab Adresse 0x00 gelegt.&lt;br /&gt;
Der zweite Opcode (0x10f00810) rechnet ebenfalls ein Biquad durch. Nur dass hier statt Kanal 1 des Codecs das voher vom SDSP berechnete Ergebnis verwendet werden soll (Kanal 0xf, wenn man so will). Ausgangsregister ist auch hier wieder Kanal 1. Da dieser Biquad unabhängig vom ersten (d.h. mit anderen Parametern) gerechnet werden soll, sind hier logischerweise auch andere Adressen für AMEM (0x08) und CMEM (0x10) angegeben. Die CMEM-Adresse ist dabei etwas unkritischer, da es ja durchaus sein kann, dass ein Audiosignal zweimal mit den selben Biquad-Werten gerechnet werden soll, bzw. unterschiedliche Kanäle mit den selben Biquad-Werten, z.b. bei einem Stereo-Equalizer. Kritischer ist allerdings die Verwendung der AMEM-Adresse. Diese sollte für jede Operation (sofern AMEM denn verwendet wird) unterschiedlich sein, vor allem bei der Berechnung von Biquads. Dies hat den Grund, dass bei Operationen, die dieselben AMEM Adressen haben, die vorher berechneten Werte überschrieben werden. Dies ist bei Biquads gaanz böse (kann u.U. SEHR laut werden), und vom Ergebnis her nicht vorhersagbar.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
[[bild:Fpga_ext_board_schematic_no_uc.JPG|thumb|500px]]&lt;br /&gt;
&lt;br /&gt;
Wie Eingangs erwähnt, benötigt das System eine (bzw. zwei) Audio-Codecs. Im aktuellen Schaltplan wird auf einen Mikroprozessor verzichtet. Dieser diente im System primär zu Initialisierung der Codecs. Dieser Vorgang kann nun vom PC aus gesteuert werden, da in der neuen ISE-6.2-Version 4 Leitungen herausgeführt wurden, welche per RS232 gesetzt und gelöscht werden. &lt;br /&gt;
Wer das System nachbauen möchte, kann entweder die TLV320AIC23B-Codecs oder auch beliebige andere Codecs verwenden, solange einer als Master und der andere als Slave arbeitet und beide auf den I2S-Modus mit 64FS und 20-Bit-Wortlänge eingestellt sind. Die Initialisierung dieser Codecs muss dann aber separat vorgenommen werden (wobei man dann wahrscheinlich nicht um einen uC drumrum kommt). Um das System zu testen (Programme und Koeffizienten in den DAP einzuspielen), wird lediglich eine serielle Schnittstelle verwendet. Wer will, kann aber genausogut den SPI-Modus verwenden und den DAP direkt von einem Mikrocontroller aus steuern. Zur Auswahl der verwendeten Schnittstelle (RS232 oder SPI) wird Pin 13 des B1-Connectors benutzt. Liegt dieser Pin auf GND, so wird der FPGA per RS232 gesteuert. Liegt dieser Pin auf 3.3V, so wird der FPGA per SPI gesteuert.&lt;br /&gt;
&lt;br /&gt;
Hier der Schaltplan meines verwendeten Audio-Boards.&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier noch die Pinbelegung des B1-Erweiterungssteckers:&lt;br /&gt;
&lt;br /&gt;
*01 GND&lt;br /&gt;
*02 VCC 5V&lt;br /&gt;
*03 VCC 3.3V&lt;br /&gt;
*04 N.C.&lt;br /&gt;
*05 SPI_CS - Chip Select (von uC nach FPGA)&lt;br /&gt;
*06 N.C.&lt;br /&gt;
*07 SPI_DI - SPI Data In (von uC nach FPGA)&lt;br /&gt;
*08 BCLK - Bit Clock (von Master Codec)&lt;br /&gt;
*09 SPI_CLK - SPI Clock (von uC nach FPGA)&lt;br /&gt;
*10 LRCLK - LR-Clock (von Master Codec)&lt;br /&gt;
*11 SPI_DO - SPI Data Out (von FPGA nach uC)&lt;br /&gt;
*12 SDOUT1 - zum D/A Wandler (Codec) 1&lt;br /&gt;
*13 IF_SEL - Interface Select (GND = RS232; VCC3.3 = SPI)&lt;br /&gt;
*14 SDIN1 - vom A/D Wandler (Codec) 1&lt;br /&gt;
*15 RXD_OUT - RS232 Signal vom MAX232 zum uC&lt;br /&gt;
*16 SDIN2 - vom A/D Wandler (Codec) 2&lt;br /&gt;
*17 TXD_IN - RS232 Signal vom uC zum MAX232&lt;br /&gt;
*18 SDOUT2 - zum D/A Wandler (Codec) 2&lt;br /&gt;
*19 GPO 3 - Chip-Select Codec 2&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 2 - Chip-Select Codec 1&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 1 - SPI-Data out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 0 - SPI-Clock Out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
&lt;br /&gt;
==Nexys Board==&lt;br /&gt;
&lt;br /&gt;
Im SVN Repository (s.u.) gibt es eine Version des DAPs für das Nexys Board.&lt;br /&gt;
Diese ist voll SW-Kompatibel zum alten Spartan 3 Board (allerdings z.Z. nur über RS232 steuerbar). Neu bei der Version ist das das Speicherinterface generisch ausgelegt wurde und ein einfacher SRAM-Controller für das Nexys Board PSDRAM geschrieben wurde. Durch das generische Interface ist es möglich andere Speicherarten anzubinden. Der verwendete Codec ist wie schon im bisherigen Projekt der TLV320AIC23B. Dieser wird via RS232 (6-pin Port A des Nexys Boards) über die GPO Leitungen (6-pin Port D des Nexys Boards) initialisiert. Die eigentlichen Datenleitungen des Codecs liegen an Port B (BCLK, LRCLK, DIN, DOUT).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download des DAP als MCS-File für das Nexys-1000 Board : [[Media:Nexys_dap.zip]]&lt;br /&gt;
&lt;br /&gt;
Diese Version ist voll lauffähig (wurde mit den Demos getestet).&lt;br /&gt;
Die Pin Belegung für die RS232 und den Audio-Codec ist wie folgt :&lt;br /&gt;
&lt;br /&gt;
Header A : RS232 Schnittstelle&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Pin 1 : RxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : TxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V/5V für MAX232/MAX3232)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header B : I2S Schnittstelle für 1 Codec&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : BitClk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : L/R Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : SDIN&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : SDOUT&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V für den Codec)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header D : Codec-Konfiguration via SPI&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : Codec 2 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : Codec 1 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : Codec SPI Data&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : Codec SPI Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DAP mit selbstgelötetem FPGA-Board==&lt;br /&gt;
&lt;br /&gt;
Auf einen Beitrag von Thomas Pototschnig hin bin ich auf sein selbstentworfenes Spartan-3-FPGA-Board (Grafikkarte) aufmerksam geworden. Thomas hat mir die Erlaubnis gegeben dieses Board für den DAP verwenden zu können und die Schaltpläne hier zu veröffentlichen. Nachdem ich von ihm noch einige Vorversionen (nur die Platinen) ergattern konnte und diese erfolgreich aufgebaut (mit Spartan 3-200 und -400) habe, bin ich von diesem Board echt begeistert. Danke nochmals.&lt;br /&gt;
&lt;br /&gt;
[[Bild:FPGA-Board.jpg|thumb|300px|left]]&lt;br /&gt;
&lt;br /&gt;
Hier Schaltplan und Layout. &lt;br /&gt;
&lt;br /&gt;
[[Media:miniFPGA-Board.zip]]&lt;br /&gt;
&lt;br /&gt;
Das Board ist zweiseitig und die &amp;quot;schlimmsten&amp;quot; zu lötenden Bauteile sind lediglich der FPGA (QFP-144) und die beiden RAMs (SOJ36, ekelig). Der Rest ist recht einfach. Auch die Inbetriebnahme des Boards gestaltete sich problemlos.&lt;br /&gt;
&lt;br /&gt;
Den Quellcode für den DAP musste ich etwas ändern und abspecken. Durch den ineffizienten VHDL-Code der MAC-Einheit gestaltete es sich schwierig, den Entwurf synthetisierbar zu machen. Das Synthetisieren auf einem FT256 gestaltete sich einfacher. Hier ist noch dergestalt Handlungsbedarf, dass die MAC-Einheit überarbeitet werden muss. &lt;br /&gt;
Der abgespeckte Entwurf läuft auf dem FPGA-Board mit einem Spartan 3-400 sowie auf einem Spartan 3-200. &lt;br /&gt;
Den Audio-Codec, das FPGA Board, einen AVR und noch etwas IO-Kram habe ich auf eine Lochrasterplatine aufgebaut. Was noch fehlt, sind MIDI- und SD/MMC-Karten-Schnittstellen. Dann hat man eine schöne Plattform für Synthesizer und Effektgeräte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anmerkung==&lt;br /&gt;
&lt;br /&gt;
Da, wie schon gesagt, das Projekt komplett auf meinem &amp;quot;Mist&amp;quot; gewachsen ist, wird es wohl noch eine Weile dauern, bis alles, was den DAP betrifft, hier in diesem Artikel (und auch in einem Dokumentations-PDF) eingearbeitet ist. Ich werde (sofern ich Zeit dazu habe) noch ein Delphi-Programm mit Sourcecode einstellen, welches den DAP richtig nutzbar macht, so dass man dann direkt damit &amp;quot;spielen&amp;quot; kann. Eine umfangreiche und vollständige Dokumentation würde momentan einfach zu viel Zeit in Anspruch nehmen, und ich möchte langsam das Projekt vorstellen, um Anregung, Kritik und Verbesserungsvorschläge ernten zu können. Ich hoffe, weitere Leute zu finden, um diesem Projekt noch mehr Leben und Möglichkeiten einhauchen zu können.&lt;br /&gt;
&lt;br /&gt;
==Fotos==&lt;br /&gt;
&lt;br /&gt;
Ursprüngliche Version:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Gesamt_wo_uc.jpg|thumb|200px|left|Spartan.3-Board und Expansion-Board]]&lt;br /&gt;
[[Bild:Codecs.jpg|thumb|200px|left|Expansion Board]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nexys-Board:&lt;br /&gt;
[[Bild:dap_nexys_v1.jpg|thumb|200px|left|Nexys-Board mit 1 Audio-Codec]]&lt;br /&gt;
[[Bild:Nexys-board-gesamt.jpg|thumb|200px|left|Nexys-Board mit Lochraster-Board und 2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
[[Bild:Nexys-board-codecs-1.jpg|thumb|200px|left|2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufbau von [[Benutzer:Andreas]]:&lt;br /&gt;
[[Bild:Nexys-Audio-DSP-Foto-Andreas.jpg|thumb|600px|left|Nexys + Breadboard + 1 [[Audio Codec Board]]]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Synth-gesamt-klein.jpg|thumb|500px|left|Aufbau des DAPs mit FPGA-Board (entworfen von Thomas Pototschnig) auf Lochraster an AVR, Codec und weiterer IO]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap-Synth-01.jpg|thumb|300px|left|Synth Board. DAP mit AVR,Codec, MIDI-Interface, RS232 (schaltbar) und LCD]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_Ansicht_02.jpg|thumb|300px|left|Synth Board. Komplettansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_klein_3.jpg|thumb|600px|left|Synth Board. Synth-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Oben.jpg|thumb|300px|left|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Unten.jpg|thumb|300px|right|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Träger-und-Mainboard.jpg|thumb|600px|left|Selbstgeroutetes DAP-Board auf Trägerplatine]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Seite.jpg|thumb|300px|left|DAP-Board mit Touch-Display Seitenansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display.jpg|thumb|600px|left|DAP-Board mit Touch-Display]]&lt;br /&gt;
&lt;br /&gt;
Diese Version des DAP hat ein Grafikdisplay incl. Touchpanel. Die Ansteuerung übernimmt der FPGA. Dort ist einer kleiner &amp;quot;Grafik-Prozessor&amp;quot; integriert, der das Update des Displays und das Kopieren der Bitmaps übernimmt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synthesizer Ansicht 1.jpg|thumb|600px|left|]]&lt;br /&gt;
Synth-Board. Komplettansicht in einem Cherry-Tastaturgehäuse (wie dafür gemacht :-)) im Synthesizer-Stil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synth Komplett.jpg|thumb|600px|left|Fertige Version des DAP als Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
Der komplette Synthesizer mit schicker Frontplatte und passendem (oben schon erwähnten :-)) Cherry-Tastatur-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Version 1.5.jpg|thumb|600px|left|Heue Hardwareversion der DAP-Hauptplatine]]&lt;br /&gt;
&lt;br /&gt;
Diese Version beinhaltet folgendes : :-) &lt;br /&gt;
&lt;br /&gt;
 - Xilinx XC3S400&lt;br /&gt;
 - ATmega2561&lt;br /&gt;
&lt;br /&gt;
 - 16 MByte (8Mx16) SDRAM&lt;br /&gt;
 - µSD Card Slot&lt;br /&gt;
 - AT45DB321 DataFlash&lt;br /&gt;
 - 24C512 EEProm&lt;br /&gt;
&lt;br /&gt;
 - TLC320AI23B Audio Codec mit Kopfhörer Ausgang&lt;br /&gt;
 - CS5343 A/D Wandler&lt;br /&gt;
 - CS4344 D/A Wandler&lt;br /&gt;
&lt;br /&gt;
 - MIDI&lt;br /&gt;
 - RS232&lt;br /&gt;
 - etlichen IO-Pins vom AVR und FPGA&lt;br /&gt;
 - 2 separaten Clock-Oszillatoren (nicht bestückt)&lt;br /&gt;
&lt;br /&gt;
... und weiterem Kleinkram (Level-Shifter, LDO, Platform-Flash, usw ... und vielen 100nF-Kondensatoren)&lt;br /&gt;
&lt;br /&gt;
Ideal zum Aufbau einer Audioplattform. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audio Demos==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein EQ-Demo mit Rosa Rauschen. Klingt wie eine Meeresbrandung.&lt;br /&gt;
&lt;br /&gt;
[[Media:eq_demo1.zip]]&lt;br /&gt;
&lt;br /&gt;
Der DAP als Synth. Der DAP wird komplett vom PC aus gesteuert (Hüllkurve, Sequencer und Filterberechnung werden im PC gemacht).&lt;br /&gt;
&lt;br /&gt;
[[Media:synthdemo1.wav.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MC505 Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen von meiner Roland-MC505 Groovebox. Es wird einfach nur ein Werkspreset abgespielt und durch den DAP gejagt.&lt;br /&gt;
&lt;br /&gt;
* [[Media:mc505-eq-demo.wav.zip|EQ-Demo]]&lt;br /&gt;
* [[Media:mc505-filter-demo.wav.zip|Filter-Demo (Tiefpass/Hochpass/Notch)]]&lt;br /&gt;
* [[Media:mc505-delay-demo.wav.zip|Delay-Demo (137BPM [657ms &amp;amp; 876 ms]/Chorus)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Synth Board Audio Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen vom DAP in Verbindung mit einem AVR der die Filterkoeffizientenberechnung sowie eine komplette Synthesizer-Steuerung beinhaltet, also qausi einen Synthesizer aus dem DAP macht (inkl. MIDI-Steuerung).&lt;br /&gt;
&lt;br /&gt;
MIDI-Sequenz und Tiefpass-Filter (Filter und Modulation über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-01.mp3]]&lt;br /&gt;
&lt;br /&gt;
Diesselbe MIDI-Sequenz mit Hochpass-Filter (Filter und Modulation ebenfalls über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-02.mp3]]&lt;br /&gt;
&lt;br /&gt;
Ein eher Techno-ähnliches Demo, welches die Auflösung des Systems (DAP+AVR+MIDI) ein wenig zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap_syn_demo_03.mp3]]&lt;br /&gt;
&lt;br /&gt;
==Delphi Tools==&lt;br /&gt;
&lt;br /&gt;
Um den DAP nutzbar zu machen benötigt man entweder ein uC Programm oder ein PC Programm. Da das verwenden von PC-Programmen einfacher fürs Spielen und Experimentieren ist, werde ich hier im Laufe der Zeit kleine Demo-Programme aber auch komplette Front-Ends für den DAP reinstellen. Die Delphi-Programme sind allesamt in Turbo-Delphi geschrieben und die dazugehörigen Quellcodes werden ebenfalls im Laufe der Zeit geuploaded. Ich werde allerdings zuerst noch das Feature des Konfigurierens der Codecs vom PC aus einbauen. &lt;br /&gt;
Nachtrag zum Konfigurieren des Codecs : Prinzipiell funktioniert es, allerdings ist das mit häßlichen Nebengeräuschen verbunden, da ich bei jeder Änderung der Lautstärke im Codec, diesen auch Resetten muß, da sonst immer beide Codecs beschrieben werden, was unschön ist. Warum dies so ist kann ich leider nicht sagen, da ich keine Möglichkeit habe die SPI-Leitungen mitzusniffen (bräuchte dafür einen kleinen LA, den ich nicht habe). &lt;br /&gt;
&lt;br /&gt;
* Demo eines 3 Band Stereo Equalizers. (Der Knopf &amp;quot;MoveIt!&amp;quot; bringt Leben ins Demo): [[Media:dap_eq_demo.zip]]&lt;br /&gt;
* Demo eines 4 Kanal Mono Mixers mit Monitor (Vorhör)-Ausgang: [[Media:dap_mix_demo.zip]]&lt;br /&gt;
* Demo eines Synthesizer-Filters: [[Media:dap_filter_demo.zip]]&lt;br /&gt;
* Demo eines 2 Kanal Delays (Der Button &amp;quot;MoveIt!&amp;quot; macht daraus einen Chorus :-))): [[Media:dap_delay_demo.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Quellcodes für das EQ-Demo, das Filter-Demo und das Delay-Demo : [[Media:dap_demos_plus_delphi_source.zip]]&lt;br /&gt;
&lt;br /&gt;
Es folgen noch der Quellcode für den Mischer (hab ich gerade nicht zur Hand) und weitere Demos (ein Synthesizer und eine 4x4 Patchbay mit EQ und was mir sonst noch einfällt. Dann natürlich mit Source-Codes).&lt;br /&gt;
Anhand dieser Beispiele wird auch eine grobe Doku erstellt.&lt;br /&gt;
&lt;br /&gt;
== SVN-Repository ==&lt;br /&gt;
&lt;br /&gt;
 svn co svn://mikrocontroller.net/audiodsp&lt;br /&gt;
&lt;br /&gt;
Ein automatisch aktualisiertes Paket mit den Daten aus dem Repository gibt es unter http://www.mikrocontroller.net/download/audiodsp-snapshot.tar.gz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
&lt;br /&gt;
* 12.07.2007: Es wurde ein generisches Speicherinterfaces welches Wartezyklen im DAP erlaubt implementiert. Dadurch kann man auf die jeweilgen Speicher des Boards eingehen. Z.Z. ist nur ein einfaches Speicherinterface für den asynchronen Betrieb des PSDRAM des Nexys Boards implementiert. Das Interface ermögicht es einen RAM Controller anzuschließen welcher z.&amp;amp;nbsp;B. ein quasi-Multiport RAM darstellt. Getestet wurde der Stand mit dem Nexys-1000 Board.&lt;br /&gt;
&lt;br /&gt;
==To do==&lt;br /&gt;
&lt;br /&gt;
* nähere Zukunft&lt;br /&gt;
** Einen Konfigurationsdialog in die Demo-Programme einarbeiten mit denen man mit den Codecs etwas spielen kann (Line-In Level, Mikrofon-Level, Bypass, Head-Phone Volume) tlw. erledigt. Funktioniert aber nicht richtig, und daher noch nicht eingebaut. Quellcodes dazu sind vorhanden.&lt;br /&gt;
** Doku anhand der Demo-Programme erstellen&lt;br /&gt;
** C-Code schnipsel erstellen&lt;br /&gt;
&lt;br /&gt;
* fernere Zukunft&lt;br /&gt;
** Front-End des DAPs machen, mit dem sich DAP-Programme erstellen lassen, der Koeffizienten-, Daten- und Wellenform-Speicher beschrieben und gelesen werden kann, der Mikro-Code editierbar gemacht wird und noch ein paar Sachen mehr machbar sind&lt;br /&gt;
** weitere Module für den Rahmen (HDD-Core, weitere Routing-Möglichkeiten innerhalb der bisherigen Cores SDSP und Util)&lt;br /&gt;
&lt;br /&gt;
==Diskussion==&lt;br /&gt;
* http://www.mikrocontroller.net/topic/65205&lt;br /&gt;
* http://www.mikrocontroller.net/topic/34376&lt;br /&gt;
&lt;br /&gt;
Falls Interesse an einer Sammelbestellung für die Platinen und Bauteile besteht &lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/144288&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]] &lt;br /&gt;
[[Kategorie:Audio]]&lt;br /&gt;
[[Kategorie:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66881</id>
		<title>Audio-DSP mit Spartan 3-FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66881"/>
		<updated>2012-06-14T22:04:00Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* Anmerkung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [[Benutzer:TheMason]]&lt;br /&gt;
&lt;br /&gt;
==Ziel==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projekts ist es, eine FPGA-basierte Plattform aufzubauen mit der es möglich ist Synthesizer, Effektgeräte, Mischpulte  oder gar ein Harddiskrecording-System zu realisieren.&lt;br /&gt;
&lt;br /&gt;
==Feature-Liste==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften des Audio-Prozessors: &lt;br /&gt;
&lt;br /&gt;
* Oszillatoren&lt;br /&gt;
* Biquads (Filter)&lt;br /&gt;
* Addierer, Schalter, Verstärker (Multiplizierer)&lt;br /&gt;
* Delays&lt;br /&gt;
* Steuerung des Audio-Prozessors via SPI oder RS232&lt;br /&gt;
* 4 Mono Ein- und Ausgänge&lt;br /&gt;
* GPO (General Purpose Outputs) zur Konfiguration der Codecs&lt;br /&gt;
&lt;br /&gt;
==Übersicht==&lt;br /&gt;
[[Bild:Overview_wo_uc.jpg|thumb|500px]]&lt;br /&gt;
Basis des Audio-Systems ist das Xilinx Spartan 3-Development Board. An diesem Board werden 2 Audio-Codecs angschlossen von denen einer als Master und der andere als Slave agiert. Optional kann noch ein Mikrocontroller angeschlossen werden welcher den FPGA per SPI steuert. Da dieses Projekt mittlerweile recht umfangreich geworden ist, kann ich hier nur einen kurzen Umriss des Systems geben. Dabei beschränke ich mich auf die grobe Funktionsweise des Audio-Prozessors, erläutere das Interface (welches ich als Basis für weitere Projekte bereits nutze) und gebe einen kleinen Überblick über die Hardware.&lt;br /&gt;
&lt;br /&gt;
Das System kann (sofern man 2 Audio-Codecs, von denen einer als Master, der andere als Slave arbeitet, angeschlossen und konfiguriert hat) direkt genutzt werden, da der DAP per RS232 gesteuert werden kann. Der Audio-Prozessor startet mit einem Stereo-Tiefpass-Filter der sich auf den ersten Codec bezieht,&lt;br /&gt;
sodass man ein erstes Demo hat (selbst wenn es etwas unspektakulär ist)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nachbau==&lt;br /&gt;
&lt;br /&gt;
Wer sich dieses System nachbauen möchte, benötigt zunächst ein FPGA-Board. Mit dem Spartan-3-Board von Digilent gestaltet sich der Nachbau einfach, weil die Programmier-Dateien für den FPGA direkt für dieses Board verwendet werden können. Nutzer anderer Boards (Xilinx) müssten zuerst die UCF-Datei für die Pins ihres jeweiligen Boards anpassen, und dieses Projekt neu synthetisieren (compilieren). Nutzer von Altera-Boards hingegen müssen die BlockRAM-Instanzen auf die Altera-Architektur anpassen (den Inhalt der RAMs dabei nicht vergessen :-). Vielleicht findet sich ja der eine oder andere der den VHDL Code für Altera-FPGAs portiert.&lt;br /&gt;
Der eigentliche wichtige Teil eines Nachbaus ist der Codec-Teil. Dieses System verwendet zwar zwei Codecs, aber es kann auch mit einem gearbeitet werden. Als Codec kommt der TLV320AIC23B von Texas Instruments zum Einsatz. Diesen kann man als kostenloses Muster bei TI direkt bekommen. &lt;br /&gt;
Des weiteren benötigt man noch eine handvoll Bauteile wie Kondensatoren, Widerstände und einen Quarz. (Ein Codec MUSS als Master laufen, sonst hat das System keine Audio-Clocks, da diese nicht vom FPGA generiert werden)&lt;br /&gt;
Die Initialisierung des Codecs wird vom PC aus gemacht. Dazu dienen die 4 GPO-Leitungen auf dem B1-Verbinder. Da der Codec nur &amp;quot;halbes&amp;quot; SPI unterstüzt (man kann nur schreiben, nicht lesen) gestaltet sich die Initialisierung recht einfach.&lt;br /&gt;
Die 4 GPO-Leitungen teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* Chip-Select Codec 2&lt;br /&gt;
* Chip-Select Codec 1&lt;br /&gt;
* SPI Data Out&lt;br /&gt;
* SPI Clock&lt;br /&gt;
&lt;br /&gt;
==Audio-Prozessor (DAP)==&lt;br /&gt;
&lt;br /&gt;
[[bild:Overview dap core.JPG|thumb|500px|right]]&lt;br /&gt;
&lt;br /&gt;
Der FPGA beinhaltet in dem gesamten System einen Quasi-DSP. Quasi-DSP deshalb, da die Struktur im Gegensatz zu einem DSP bzw. Mikrocontroller keine Verzweigungen, Interrupts oder ähnliches zulässt. Der Audio-Prozessor besteht im wesentlichen aus 3 Teilen : einem Rahmen, einem SDSP (Small DSP)-Kern &lt;br /&gt;
sowie einem Utility-Kern. Beide Kerne können theoretisch parallel arbeiten, da jeder Kern einen eigenen Zustandsautomaten und einen eigenen Microcode-Speicher besitzen. Diese Möglichkeit ist allerdings noch nicht implementiert.&lt;br /&gt;
&lt;br /&gt;
Der SDSP-Kern besteht im wesentlichen aus einer MAC-Einheit, einem Speicher für Audiodaten, einem Koeffizienten-Speicher, einem Adressgenerator und mehreren Muxern, sowie dem schon angesprochenen Zustandsautomaten und dem Microcode. Weiterhin ist ein Hidden-Write- (bzw. Shadow Register) Mechanismus integriert,&lt;br /&gt;
welcher ein &amp;quot;knackserfreies&amp;quot; Aktualisieren von Koeffizienten ermöglicht. Alle diese Komponenten werden vom Microcode aus gesteuert (genau wie bei einem Mikrocontroller). Mit diesem Kern ist es möglich, Audiosignale zu bearbeiten. Zu Den Bearbeitungsmöglichkeiten zählen in erster Linie das Verändern der Lautstärke, Mischen, Filtern (Biquad) sowie Laden und Speichern von &lt;br /&gt;
Audiowerten.&lt;br /&gt;
&lt;br /&gt;
Der Utility-Kern besteht aus einem Akkumulator (für DDS), einem Shaper, einem Adressgenerator, einem Wavetable-Speicher, einem Zufallszahlengenerator, einigen Muxern, (einem Adressgenerator für SRAM, einem SRAM-Controller; diese sind allerdings nur nutzbar, wenn man das ganze mit dem ISE 6.2 synthetisiert) &lt;br /&gt;
und dem schon angesprochenen Zustandsautomaten und dem Microcode. Der Microcode steuert (genau wie beim SDSP-Kern) dabei die einzelnen Komponenten des Utility-Kerns. Dieser Kern ist für das Erzeugen von Audiosignalen zuständig, und erlaubt ein Audiosignal zu verzögern, sofern man die ISE-Version 6.2 verwendet (später dazu mehr). Als Wellenformen stehen Sägezahn, Rechteck (mit veränderbarer Pulsbreite), Rauschen sowie benutzderdefinierbare Wellenformen (Wavetable) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Der Rahmen besteht aus einem Zustandsautomaten, einem Programmspeicher, einigen Muxern, sowie einem doppelten I2S-Sender/Empfänger (für 2 Stereo Ein- und Ausgänge). In den Rahmen werden die beiden Kerne &amp;quot;eingehängt&amp;quot;. Die Kerne werden vom Programmspeicher aus mit Daten versorgt, und vom Zustandsautomaten angesteuert. Der Programmspeicher (PMEM) ist als 512x32 Bit organisiert. Das heißt, dass ein Befehl im Programmspeicher 32 Bit an Informationen enthält und der Audioprozessor max. 512 Befehle umfassen kann.&lt;br /&gt;
&lt;br /&gt;
===SDSP-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:SDSP-Struct.jpg|thumb|300px|left|Struktur des SDSP-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Der eigentliche Kern des DAPs ist die MAC-Einheit. Mit ihr werden die grundlegenden Operationen Multiplikation und Addition durchgeführt. Es ist eine 32x32-Bit-Einheit. &lt;br /&gt;
Die Funktionsweise des Kerns ist eigentlich recht einfach. &lt;br /&gt;
Die MAC-Einheit hat 2 Eingänge. Einer dieser Eingänge kann ein Audiosignal, ein Wert aus dem Audiospeicher (AMEM-BlockRAM) oder ein zuvor berechnetes Ergebnis sein. Der andere Eingang kann ein Koeffizient aus dem CMEM-BlockRAM oder eine Konstante (1.000, 0.000 oder -1.000) sein.&lt;br /&gt;
Der Ausgang (32-Bit, hart geclippt) geht auf das AMEM-BlockRAM und zum Ausgangs-Clipping. Das Ausgangsclipping schneidet das Audiosignal auf 24-Bit zurecht.&lt;br /&gt;
Die Adressen für die Speicher (AMEM und CMEM) werden im Addressgenerator erzeugt. Dieser wird von außen mit einer 8-Bit-Basis-Adresse gespeist und erzeugt einen Offset zu den Eingangsadressen. Er besitzt 2 setzbare Zähler und einige Multiplexer.&lt;br /&gt;
Alle Steuersignale der Komponenten von einem weiteren aus BlockRAM (MMEM) versorgt. Weiterhin wird von außen eine Startadresse vorgegeben. Dadurch lassen sich quasi Opcodes mit von außen vorgegeben Parametern (Adressen) aufrufen.&lt;br /&gt;
Das MMEM-BlockRAM wird nun einfach nur linear ausgelesen bis ein Stopbit gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Util-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Util-Core.jpg|thumb|300px|left|Struktur des Utility-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Beschreibung folgt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opcodes des DAP===&lt;br /&gt;
&lt;br /&gt;
Diese 32 Bit eines Befehls teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* 4 Bit = Opcode (für SDSP und Utility Kern gleich)&lt;br /&gt;
* 2 Bit = noch leer&lt;br /&gt;
* 1 Bit = Core Select (SDSP oder Utility)&lt;br /&gt;
* 1 Bit = Ende des Programms&lt;br /&gt;
* 4 Bit = Eingangsrouting (Kanal 1 - 4, Ergebnis SDSP-Kern, Ergebnis Utility-Kern)&lt;br /&gt;
* 4 Bit = Ausgangsrouting (SDSP-Ausgang auf Kanal 1-4, Utility-Ausgang auf Kanal 1-4)&lt;br /&gt;
* 8 Bit = Adresse 1 (bei SDSP für Audio-Memory, bei Utility-Kern für Datenspeicher)&lt;br /&gt;
* 8 Bit = Adresse 2 (bei SDSP für Koeffizientenspeicher, bei Utility-Kern unbenutzt)&lt;br /&gt;
&lt;br /&gt;
Das Eingangsrouting bestimmt, mit welchem Signal der gewählte Kern arbeiten soll. Dies können die Eingänge 1-4 aber auch ein vorher berechnetes Ergebnis des SDSP- bzw. Utility-Kerns sein. Das Ausgangsrouting bestimmt, von welchem Kern das Signal auf welchen Ausgang geroutet wird.&lt;br /&gt;
&lt;br /&gt;
Die Opcodes des DAPs sind:&lt;br /&gt;
&lt;br /&gt;
SDSP-Kern:&lt;br /&gt;
* Biquad rechnen&lt;br /&gt;
* Audiowert speichern&lt;br /&gt;
* Audiowert laden&lt;br /&gt;
* Move eines Wertes im Audiospeicher&lt;br /&gt;
* Summe rücksetzen&lt;br /&gt;
* Eingang zu Summe addieren&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe addieren&lt;br /&gt;
* Eingang zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Lautstärke &lt;br /&gt;
&lt;br /&gt;
Utility-Kern:&lt;br /&gt;
* Oszillator (DDS-Teil)&lt;br /&gt;
* Waveshaper&lt;br /&gt;
* Verzögerung&lt;br /&gt;
&lt;br /&gt;
Der Ablauf eines Audio-Programms ist folgender:&lt;br /&gt;
&lt;br /&gt;
Sobald ein neues Sample anliegt, wird die Abarbeitung des Programms von Adresse 0x0000 an im PMEM angestoßen. Es wird dabei jeweils ein Befehl geladen und Daten wie Opcode und Adressen liegen dabei an beide Kernen gleichermaßen an. Ist das Programm-Ende-Bit nicht gesetzt, so wird der jeweilige Kern (mit dem im Opcode angegeben Routing) angesteuert. Legt der betreffende Kern sein Ready-Signal auf 1, so wird der nächste Befehl abgearbeitet. Dieses Verhalten (Laden und Verteilen von Opcode-Daten sowie die Ablaufsteuerung, also das Ansteuern des Programms, Ansteuern der einzelnen Kerne, warten auf dessen Abarbeitung und das Programmende) wird vom Rahmen übernommen.&lt;br /&gt;
&lt;br /&gt;
===Speicherorganisation===&lt;br /&gt;
&lt;br /&gt;
Alle Speicher die vom DAP angesprochen werden, haben eine Wortbreite von 32 Bit, der Zugriff erfolgt aber ausschließlich über eine Breite von 8 Bit (Interface).&lt;br /&gt;
&lt;br /&gt;
DAP&lt;br /&gt;
* Programmspeicher 	(PMEM)   0x0000 - 0x07ff&lt;br /&gt;
&lt;br /&gt;
SDSP&lt;br /&gt;
* Audiospeicher   	(AMEM)   von außen nicht zugänglich&lt;br /&gt;
* Koeffizientenspeicher 	(CMEM)   0x2000 - 0x2023  (man &amp;quot;sieht&amp;quot; nur den Hidden Write -&amp;gt; später mehr dazu)&lt;br /&gt;
* Microcodespeicher      (MMEM)   0x4000 - 0x47ff&lt;br /&gt;
&lt;br /&gt;
Utility-Core&lt;br /&gt;
* Datenspeicher          (DMEM)   0x6000 - 0x67ff&lt;br /&gt;
* Wavetable-Speicher      (WMEM)   0x8000 - 0x87ff&lt;br /&gt;
* Microcodespeicher      (UMEM)   0xa000 - 0xa7ff&lt;br /&gt;
&lt;br /&gt;
===Hidden-Write===&lt;br /&gt;
Um bei Änderung der Koeffizienten Knackser zu vermeiden (die dadurch entstehen das der Koeffizient nur teilweise [durch 8-Bit-Zugriffe] geändert wird, währenddessen aber Audio trotzdem noch &amp;quot;weiterläuft&amp;quot; und mit &amp;quot;falschen&amp;quot; Zwischenwerten gerechnet wird), ist ein Mechanismus implementiert, der die zu ändernden Koeffizienten im Hintergund in den Speicher schreibt. Um diesen Mechanismus zu nutzen, müssen zuerst die Koeffizienten in interne Register&lt;br /&gt;
geschrieben werden. Die Register (es sind 8 32-Bit-Register) liegen im Speicherbereich 0x2000 bis 0x201f. Die Speicherstelle 0x2020 gibt die Startadresse innerhalb des Koeffizientenspeichers an. Diese Adresse ist nur 8 Bit breit. Die Speicherstelle 0x2021 gibt an, wieviele der 8 Register übertragen werden sollen. Die Speicherstelle 0x2022 löst den Kopiervorgang aus. Hier reicht es, ein Dummy-Byte zu schreiben. Um den Kopiervorgang zu beenden (MUSS GEMACHT WERDEN!, sonst können keine weiteren Koeffizientenupdates gemacht werden), schreibt man an Speicherstelle 0x2023 ebenfalls ein Dummy-Byte.&lt;br /&gt;
&lt;br /&gt;
===I/O Register===&lt;br /&gt;
&lt;br /&gt;
Es gibt noch einen 8-Bit breiten Adressbereich innerhalb des DAPs, mit dem der I2S-Teil stummgeschaltet werden kann. Weiterhin hat man die Möglichkeit, die Anzahl der Systemtakte pro Sample und die Anzahl der aktiven Systemtakte (also die Zeit die der Audioprozessor beschäftigt ist) zu ermitteln. Dadurch lässt sich eine Auslastungsanzeige des DAPs realisieren.&lt;br /&gt;
&lt;br /&gt;
===Interface===&lt;br /&gt;
&lt;br /&gt;
Um von außen nun ein Programm (bzw. Koeffizienten und Daten) zu laden, ist eine einfach zu handhabende und erweiterbare Schnittstelle implementiert. Die Schnittstelle kann per RS232 (fest eingestellt auf 115,2kBaud) oder per SPI (wird hardwaremäßig eingestellt) angesteuert werden. Die Schnittstelle in ihrer Gesamtheit ist schichtweise aufgebaut und beginnt mit einem Daten-Dispatcher. Dieser Daten-Dispatcher entscheidet (nachdem dieser selektiert wurde) mit dem ersten Byte, an welches angeschlossene Gerät der weitere Datenstrom geleitet wird.&lt;br /&gt;
&lt;br /&gt;
Als angeschlossene Geräte sind im aktuellen Entwurf ein Gerät namens &amp;quot;StdIO&amp;quot; und der Audioprozessor verfügbar.&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;StdIO&amp;quot;-Gerät steuert die 7-Segment-Anzeige (16-Bit-Hexadezimalanzeige oder 32-Bit-Einzelsegmentanzeige) sowie die 8 Leuchtdioden, und erlaubt es, die 3 Drucktaster sowie die 8 Schiebeschalter auszulesen.&lt;br /&gt;
&lt;br /&gt;
Der Audioprozessor besteht (schnittstellenseitig) nur aus einer Speicherzugriffsschnittstelle. Diese Schnittstelle entscheidet mit dem ersten Byte (sobald es selektiert wurde), ob in den Speicher geschrieben, von diesem gelesen, ein I/O-Schreib- oder -Lesezugriff erfolgen soll.&lt;br /&gt;
Die folgenden 2 Bytes (im Falle eines I/O-Zugriffs nur 1 Byte) bestimmen die Adresse und damit den Speicherbereich des Audioprozessors, auf den zugegriffen werden soll. Die Speicherschnittstelle besitzt einen Autoinkrementierer,&lt;br /&gt;
mit dem fortlaufende Bytes einfach hintereinander geschrieben werden können, ohne dass jedes mal wieder der FPGA, das Gerät und die neue Adresse neu geschrieben werden müssen, was den Zugriff erheblich beschleunigt.&lt;br /&gt;
&lt;br /&gt;
Ursprünglich basierte das System auf einem SPI-Interface. Dabei wurde die Chip-Select-Leitung als &amp;quot;globaler&amp;quot; Interface-Reset betrachtet, d.h. war die Leitung auf High, war der FPGA deselektiert und und alle Interface-Zustandsautomaten wurden im Reset gehalten. Erst mit dem Setzen dieser Leitung wurde der FPGA angesprochen. (erstes Byte -&amp;gt; Daten-Dispatcher, folgende Bytes gehen an das ausgewählte Gerät). Weiterhin hat SPI die Eigenschaft, dass mit jedem gesendeten Byte auch eines empfangen wurde. Der Umstand, dass RS232 weder eine Chip-Select Leitung benötigt noch eine synchrone Übertragung erzwingt, führt zu dem Umstand, dass man bei Nutzung von RS232 einige Befehle zusätzlich benötigt. Diese Befehle werden durch das Zeichen 0x1b (ESC) eingeleitet. Soll statt der &amp;quot;Spezialfunktion&amp;quot; das Byte 0x1b übertragen werden, so wird dieses einfach erneut gesendet. Soll die Chip-Select-Leitung gesetzt bzw. gelöscht werden, so wird die Sequenz 0x1b 0x00 (Selektieren) bzw.&lt;br /&gt;
0x1b 0x01 (Deselektieren) gesendet. Soll ein zuvor im Ausgangsregister gesetztes Byte gesendet werden, so muss die Sequenz 0x1b 0x02 gesendet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
0x121b auf dem 7-Segment-Display per RS232 anzeigen:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x00      (Hi-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x12      (Wert 12)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x01      (Lo-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x1b 0x1b (Wert 1b -&amp;gt; zu beachten: wenn der Wert 0x1b übertragen werden soll, muss dieser doppelt gesendet werden !!)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Beispiel, um in den Programmspeicher des Audioprozessors an Adresse 0x0010 das Langwort 0x12233445 zu schreiben:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf1      (DAP selektieren)&lt;br /&gt;
*- 0x00      (Speicher schreiben)&lt;br /&gt;
*- 0x00      &lt;br /&gt;
*- 0x10      (Adresse 0x0010 -&amp;gt; PMEM-Adresse 0x010)&lt;br /&gt;
*- 0x12	    (Adresse 0x0010 -&amp;gt; 0x12)	&lt;br /&gt;
*- 0x23	    (Adresse 0x0011 -&amp;gt; 0x23, autoincrement)&lt;br /&gt;
*- 0x34      (Adresse 0x0012 -&amp;gt; 0x34, autoincrement)&lt;br /&gt;
*- 0x45      (Adresse 0x0013 -&amp;gt; 0x45, autoincrement)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Auslesen der 8 Schalter:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x04      (Schalter auslesen)&lt;br /&gt;
*- 0x00	    (dummy byte -&amp;gt; überträgt Schalterstellung in Ausgaberegister)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man die 8 Schalterstellungen binärcodiert)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Der Datendispatcher (welcher mit dem ersten Byte nach dem Selektieren des FPGAs [0x1b 0x00] angesprochen wird) hat weiterhin einige nützliche Funktionen, die in ihrer Gesamtheit allerdings noch nicht ausführlich getestet wurden. Darunter sind Funktionen, mit denen Informationen über die an den Ports des Daten-Dispatchers angeschlossenen Geräte zu ermitteln. Diese Funktion kann dazu genutzt werden, um zu ermitten, welche Geräte im FPGA implementiert sind und an welchen Ports welche Geräte angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
Anzahl der Ports des Daten-Dispatchers liefern:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xed      (Anzahl Ports lesen)&lt;br /&gt;
*- 0x00      (dummy byte -&amp;gt; überträgt Inhalt des Ausgaberegisters)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man 0x22)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
===DAP-Modul-Schnipsel===&lt;br /&gt;
&lt;br /&gt;
Um mal &amp;quot;eben&amp;quot; mit dem DAP zu spielen, ein paar Schnipsel die sich recht leicht zu kompletten Funktionsblöcken zusammenschließen lassen.&lt;br /&gt;
Es werden hier nur die RS232-Sequenzen mit einer kurzen Erklärung aufgelistet.&lt;br /&gt;
&lt;br /&gt;
*Dual Mono Biquad&lt;br /&gt;
&lt;br /&gt;
*ESC 0x00 - FPGA selektieren&lt;br /&gt;
*0xF1     - DAP auswählen&lt;br /&gt;
*0x00 0x00 0x00 - Memory Write (Adresse 0x0000 -&amp;gt; Program Memory)&lt;br /&gt;
*0x10 0x00 0x00 0x08 - Biquad mit Kanal 1 (0) rechnen (AMEM = 0x00;CMEM = 0x08) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x10 0xf0 0x08 0x10 - Biquad mit vorherigem Ergebnis (0xf) rechnen (AMEM = 0x08; CMEM = 0x10) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x01 0x00 0x00 0x00 - Audioprogramm Ende (wichtig !!!)&lt;br /&gt;
*ESC 0x01 - DAP &amp;amp; FPGA deselektieren&lt;br /&gt;
&lt;br /&gt;
Erklärung :&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Opcodes 0x100008 deutet an, dass ein Biquad durchgerechnet werden soll. Das Eingangsregister 0 bedeutet, dass Kanal 1 des 1. Codecs verwendet wird. Das Ausgangsregister, welches nach Fertigstellung des Ergebnisses benutzt werden soll, ist 0 (-&amp;gt; Kanal 1 des 1. Codecs). Der Teil 0x00 0x08 bedeutet hierbei, dass die Biquad-Koeffizienten im CMEM ab Adresse 0x08 stehen. Die Audio-Zwischenwerte werden in den Audiospeicher AMEM ab Adresse 0x00 gelegt.&lt;br /&gt;
Der zweite Opcode (0x10f00810) rechnet ebenfalls ein Biquad durch. Nur dass hier statt Kanal 1 des Codecs das voher vom SDSP berechnete Ergebnis verwendet werden soll (Kanal 0xf, wenn man so will). Ausgangsregister ist auch hier wieder Kanal 1. Da dieser Biquad unabhängig vom ersten (d.h. mit anderen Parametern) gerechnet werden soll, sind hier logischerweise auch andere Adressen für AMEM (0x08) und CMEM (0x10) angegeben. Die CMEM-Adresse ist dabei etwas unkritischer, da es ja durchaus sein kann, dass ein Audiosignal zweimal mit den selben Biquad-Werten gerechnet werden soll, bzw. unterschiedliche Kanäle mit den selben Biquad-Werten, z.b. bei einem Stereo-Equalizer. Kritischer ist allerdings die Verwendung der AMEM-Adresse. Diese sollte für jede Operation (sofern AMEM denn verwendet wird) unterschiedlich sein, vor allem bei der Berechnung von Biquads. Dies hat den Grund, dass bei Operationen, die dieselben AMEM Adressen haben, die vorher berechneten Werte überschrieben werden. Dies ist bei Biquads gaanz böse (kann u.U. SEHR laut werden), und vom Ergebnis her nicht vorhersagbar.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
[[bild:Fpga_ext_board_schematic_no_uc.JPG|thumb|500px]]&lt;br /&gt;
&lt;br /&gt;
Wie Eingangs erwähnt, benötigt das System eine (bzw. zwei) Audio-Codecs. Im aktuellen Schaltplan wird auf einen Mikroprozessor verzichtet. Dieser diente im System primär zu Initialisierung der Codecs. Dieser Vorgang kann nun vom PC aus gesteuert werden, da in der neuen ISE-6.2-Version 4 Leitungen herausgeführt wurden, welche per RS232 gesetzt und gelöscht werden. &lt;br /&gt;
Wer das System nachbauen möchte, kann entweder die TLV320AIC23B-Codecs oder auch beliebige andere Codecs verwenden, solange einer als Master und der andere als Slave arbeitet und beide auf den I2S-Modus mit 64FS und 20-Bit-Wortlänge eingestellt sind. Die Initialisierung dieser Codecs muss dann aber separat vorgenommen werden (wobei man dann wahrscheinlich nicht um einen uC drumrum kommt). Um das System zu testen (Programme und Koeffizienten in den DAP einzuspielen), wird lediglich eine serielle Schnittstelle verwendet. Wer will, kann aber genausogut den SPI-Modus verwenden und den DAP direkt von einem Mikrocontroller aus steuern. Zur Auswahl der verwendeten Schnittstelle (RS232 oder SPI) wird Pin 13 des B1-Connectors benutzt. Liegt dieser Pin auf GND, so wird der FPGA per RS232 gesteuert. Liegt dieser Pin auf 3.3V, so wird der FPGA per SPI gesteuert.&lt;br /&gt;
&lt;br /&gt;
Hier der Schaltplan meines verwendeten Audio-Boards.&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier noch die Pinbelegung des B1-Erweiterungssteckers:&lt;br /&gt;
&lt;br /&gt;
*01 GND&lt;br /&gt;
*02 VCC 5V&lt;br /&gt;
*03 VCC 3.3V&lt;br /&gt;
*04 N.C.&lt;br /&gt;
*05 SPI_CS - Chip Select (von uC nach FPGA)&lt;br /&gt;
*06 N.C.&lt;br /&gt;
*07 SPI_DI - SPI Data In (von uC nach FPGA)&lt;br /&gt;
*08 BCLK - Bit Clock (von Master Codec)&lt;br /&gt;
*09 SPI_CLK - SPI Clock (von uC nach FPGA)&lt;br /&gt;
*10 LRCLK - LR-Clock (von Master Codec)&lt;br /&gt;
*11 SPI_DO - SPI Data Out (von FPGA nach uC)&lt;br /&gt;
*12 SDOUT1 - zum D/A Wandler (Codec) 1&lt;br /&gt;
*13 IF_SEL - Interface Select (GND = RS232; VCC3.3 = SPI)&lt;br /&gt;
*14 SDIN1 - vom A/D Wandler (Codec) 1&lt;br /&gt;
*15 RXD_OUT - RS232 Signal vom MAX232 zum uC&lt;br /&gt;
*16 SDIN2 - vom A/D Wandler (Codec) 2&lt;br /&gt;
*17 TXD_IN - RS232 Signal vom uC zum MAX232&lt;br /&gt;
*18 SDOUT2 - zum D/A Wandler (Codec) 2&lt;br /&gt;
*19 GPO 3 - Chip-Select Codec 2&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 2 - Chip-Select Codec 1&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 1 - SPI-Data out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 0 - SPI-Clock Out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
&lt;br /&gt;
==Nexys Board==&lt;br /&gt;
&lt;br /&gt;
Im SVN Repository (s.u.) gibt es eine Version des DAPs für das Nexys Board.&lt;br /&gt;
Diese ist voll SW-Kompatibel zum alten Spartan 3 Board (allerdings z.Z. nur über RS232 steuerbar). Neu bei der Version ist das das Speicherinterface generisch ausgelegt wurde und ein einfacher SRAM-Controller für das Nexys Board PSDRAM geschrieben wurde. Durch das generische Interface ist es möglich andere Speicherarten anzubinden. Der verwendete Codec ist wie schon im bisherigen Projekt der TLV320AIC23B. Dieser wird via RS232 (6-pin Port A des Nexys Boards) über die GPO Leitungen (6-pin Port D des Nexys Boards) initialisiert. Die eigentlichen Datenleitungen des Codecs liegen an Port B (BCLK, LRCLK, DIN, DOUT).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download des DAP als MCS-File für das Nexys-1000 Board : [[Media:Nexys_dap.zip]]&lt;br /&gt;
&lt;br /&gt;
Diese Version ist voll lauffähig (wurde mit den Demos getestet).&lt;br /&gt;
Die Pin Belegung für die RS232 und den Audio-Codec ist wie folgt :&lt;br /&gt;
&lt;br /&gt;
Header A : RS232 Schnittstelle&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Pin 1 : RxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : TxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V/5V für MAX232/MAX3232)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header B : I2S Schnittstelle für 1 Codec&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : BitClk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : L/R Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : SDIN&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : SDOUT&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V für den Codec)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header D : Codec-Konfiguration via SPI&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : Codec 2 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : Codec 1 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : Codec SPI Data&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : Codec SPI Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DAP mit selbstgelötetem FPGA-Board==&lt;br /&gt;
&lt;br /&gt;
Auf einen Beitrag von Thomas Pototschnig hin bin ich auf sein selbstentworfenes Spartan-3-FPGA-Board (Grafikkarte) aufmerksam geworden. Thomas hat mir die Erlaubnis gegeben dieses Board für den DAP verwenden zu können und die Schaltpläne hier zu veröffentlichen. Nachdem ich von ihm noch einige Vorversionen (nur die Platinen) ergattern konnte und diese erfolgreich aufgebaut (mit Spartan 3-200 und -400) habe, bin ich von diesem Board echt begeistert. Danke nochmals.&lt;br /&gt;
&lt;br /&gt;
[[Bild:FPGA-Board.jpg|thumb|300px|left]]&lt;br /&gt;
&lt;br /&gt;
Hier Schaltplan und Layout. &lt;br /&gt;
&lt;br /&gt;
[[Media:miniFPGA-Board.zip]]&lt;br /&gt;
&lt;br /&gt;
Das Board ist zweiseitig und die &amp;quot;schlimmsten&amp;quot; zu lötenden Bauteile sind lediglich der FPGA (QFP-144) und die beiden RAMs (SOJ36, ekelig). Der Rest ist recht einfach. Auch die Inbetriebnahme des Boards gestaltete sich problemlos.&lt;br /&gt;
&lt;br /&gt;
Den Quellcode für den DAP musste ich etwas ändern und abspecken. Durch den ineffizienten VHDL-Code der MAC-Einheit gestaltete es sich schwierig, den Entwurf synthetisierbar zu machen. Das Synthetisieren auf einem FT256 gestaltete sich einfacher. Hier ist noch dergestalt Handlungsbedarf, dass die MAC-Einheit überarbeitet werden muss. &lt;br /&gt;
Der abgespeckte Entwurf läuft auf dem FPGA-Board mit einem Spartan 3-400 sowie auf einem Spartan 3-200. &lt;br /&gt;
Den Audio-Codec, das FPGA Board, einen AVR und noch etwas IO-Kram habe ich auf eine Lochrasterplatine aufgebaut. Was noch fehlt, sind MIDI- und SD/MMC-Karten-Schnittstellen. Dann hat man eine schöne Plattform für Synthesizer und Effektgeräte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anmerkung==&lt;br /&gt;
&lt;br /&gt;
Da, wie schon gesagt, das Projekt komplett auf meinem &amp;quot;Mist&amp;quot; gewachsen ist, wird es wohl noch eine Weile dauern, bis alles, was den DAP betrifft, hier in diesem Artikel (und auch in einem Dokumentations-PDF) eingearbeitet ist. Ich werde (sofern ich Zeit dazu habe) noch ein Delphi-Programm mit Sourcecode einstellen, welches den DAP richtig nutzbar macht, so dass man dann direkt damit &amp;quot;spielen&amp;quot; kann. Eine umfangreiche und vollständige Dokumentation würde momentan einfach zu viel Zeit in Anspruch nehmen, und ich möchte langsam das Projekt vorstellen, um Anregung, Kritik und Verbesserungsvorschläge ernten zu können. Ich hoffe, weitere Leute zu finden, um diesem Projekt noch mehr Leben und Möglichkeiten einhauchen zu können.&lt;br /&gt;
&lt;br /&gt;
==Fotos==&lt;br /&gt;
&lt;br /&gt;
Ursprüngliche Version:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Gesamt_wo_uc.jpg|thumb|200px|left|Spartan3 Board und Expansion Board]]&lt;br /&gt;
[[Bild:Codecs.jpg|thumb|200px|left|Expansion Board]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nexys-Board:&lt;br /&gt;
[[Bild:dap_nexys_v1.jpg|thumb|200px|left|Nexys Board mit 1 Audio-Codec]]&lt;br /&gt;
[[Bild:Nexys-board-gesamt.jpg|thumb|200px|left|Nexys Board mit Lochraster-Board und 2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
[[Bild:Nexys-board-codecs-1.jpg|thumb|200px|left|2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufbau von [[Benutzer:Andreas]]:&lt;br /&gt;
[[Bild:Nexys-Audio-DSP-Foto-Andreas.jpg|thumb|600px|left|Nexys + Breadboard + 1 [[Audio Codec Board]]]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Synth-gesamt-klein.jpg|thumb|500px|left|Aufbau des DAPs mit FPGA-Board (entworfen von Thomas Pototschnig) auf Lochraster an AVR, Codec und weiterer IO]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap-Synth-01.jpg|thumb|300px|left|Synth Board. DAP mit AVR,Codec, MIDI Interface, RS232 (schaltbar) und LCD]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_Ansicht_02.jpg|thumb|300px|left|Synth Board. Komplettansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_klein_3.jpg|thumb|600px|left|Synth Board. Synth-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Oben.jpg|thumb|300px|left|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Unten.jpg|thumb|300px|right|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Träger-und-Mainboard.jpg|thumb|600px|left|Selbstgeroutetes DAP-Board auf Trägerplatine]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Seite.jpg|thumb|300px|left|DAP-Board mit Touch-Display Seitenansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display.jpg|thumb|600px|left|DAP-Board mit Touch-Display]]&lt;br /&gt;
&lt;br /&gt;
Diese Version des DAP hat ein Grafikdisplay incl. Touchpanel. Die Ansteuerung übernimmt der FPGA. Dort ist einer kleiner &amp;quot;Grafik-Prozessor&amp;quot; integriert der das Update des Displays und das Kopieren der Bitmaps übernimmt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synthesizer Ansicht 1.jpg|thumb|600px|left|]]&lt;br /&gt;
Synth-Board. Komplettansicht in einem Cherry-Tastaturgehäuse (wie dafür gemacht :-)) im Synthesizer-Stil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synth Komplett.jpg|thumb|600px|left|Fertige Version des DAP als Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
Der komplette Synthesizer mit schicker Frontplatte und passendem (oben schon erwähnten :-)) Cherry-Tastatur-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Version 1.5.jpg|thumb|600px|left|Heue Hardware Version der DAP Hauptplatine]]&lt;br /&gt;
&lt;br /&gt;
Diese Version beinhaltet folgendes : :-) &lt;br /&gt;
&lt;br /&gt;
 - Xilinx XC3S400&lt;br /&gt;
 - ATmega2561&lt;br /&gt;
&lt;br /&gt;
 - 16 MByte (8Mx16) SDRAM&lt;br /&gt;
 - µSD Card Slot&lt;br /&gt;
 - AT45DB321 DataFlash&lt;br /&gt;
 - 24C512 EEProm&lt;br /&gt;
&lt;br /&gt;
 - TLC320AI23B Audio Codec mit Kopfhörer Ausgang&lt;br /&gt;
 - CS5343 A/D Wandler&lt;br /&gt;
 - CS4344 D/A Wandler&lt;br /&gt;
&lt;br /&gt;
 - MIDI&lt;br /&gt;
 - RS232&lt;br /&gt;
 - etlichen IO-Pins vom AVR und FPGA&lt;br /&gt;
 - 2 separaten Clock-Oszillatoren (nicht bestückt)&lt;br /&gt;
&lt;br /&gt;
... und weiterem Kleinkram (LevelShifter, LDO, Platformflash, usw ... und vielen 100nFern)&lt;br /&gt;
&lt;br /&gt;
Ideal zum Aufbau einer Audio-Platform. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audio Demos==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein EQ-Demo mit Rosa Rauschen. Klingt wie eine Meeresbrandung.&lt;br /&gt;
&lt;br /&gt;
[[Media:eq_demo1.zip]]&lt;br /&gt;
&lt;br /&gt;
Der DAP als Synth. Der DAP wird komplett vom PC aus gesteuert (Hüllkurve, Sequencer und Filterberechnung werden im PC gemacht).&lt;br /&gt;
&lt;br /&gt;
[[Media:synthdemo1.wav.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MC505 Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen von meiner Roland-MC505 Groovebox. Es wird einfach nur ein Werkspreset abgespielt und durch den DAP gejagt.&lt;br /&gt;
&lt;br /&gt;
* [[Media:mc505-eq-demo.wav.zip|EQ-Demo]]&lt;br /&gt;
* [[Media:mc505-filter-demo.wav.zip|Filter-Demo (Tiefpass/Hochpass/Notch)]]&lt;br /&gt;
* [[Media:mc505-delay-demo.wav.zip|Delay-Demo (137BPM [657ms &amp;amp; 876 ms]/Chorus)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Synth Board Audio Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen vom DAP in Verbindung mit einem AVR der die Filterkoeffizientenberechnung sowie eine komplette Synthesizer-Steuerung beinhaltet, also qausi einen Synthesizer aus dem DAP macht (inkl. MIDI-Steuerung).&lt;br /&gt;
&lt;br /&gt;
MIDI-Sequenz und Tiefpass-Filter (Filter und Modulation über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-01.mp3]]&lt;br /&gt;
&lt;br /&gt;
Diesselbe MIDI-Sequenz mit Hochpass-Filter (Filter und Modulation ebenfalls über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-02.mp3]]&lt;br /&gt;
&lt;br /&gt;
Ein eher Techno-ähnliches Demo, welches die Auflösung des Systems (DAP+AVR+MIDI) ein wenig zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap_syn_demo_03.mp3]]&lt;br /&gt;
&lt;br /&gt;
==Delphi Tools==&lt;br /&gt;
&lt;br /&gt;
Um den DAP nutzbar zu machen benötigt man entweder ein uC Programm oder ein PC Programm. Da das verwenden von PC-Programmen einfacher fürs Spielen und Experimentieren ist, werde ich hier im Laufe der Zeit kleine Demo-Programme aber auch komplette Front-Ends für den DAP reinstellen. Die Delphi-Programme sind allesamt in Turbo-Delphi geschrieben und die dazugehörigen Quellcodes werden ebenfalls im Laufe der Zeit geuploaded. Ich werde allerdings zuerst noch das Feature des Konfigurierens der Codecs vom PC aus einbauen. &lt;br /&gt;
Nachtrag zum Konfigurieren des Codecs : Prinzipiell funktioniert es, allerdings ist das mit häßlichen Nebengeräuschen verbunden, da ich bei jeder Änderung der Lautstärke im Codec, diesen auch Resetten muß, da sonst immer beide Codecs beschrieben werden, was unschön ist. Warum dies so ist kann ich leider nicht sagen, da ich keine Möglichkeit habe die SPI-Leitungen mitzusniffen (bräuchte dafür einen kleinen LA, den ich nicht habe). &lt;br /&gt;
&lt;br /&gt;
* Demo eines 3 Band Stereo Equalizers. (Der Knopf &amp;quot;MoveIt!&amp;quot; bringt Leben ins Demo): [[Media:dap_eq_demo.zip]]&lt;br /&gt;
* Demo eines 4 Kanal Mono Mixers mit Monitor (Vorhör)-Ausgang: [[Media:dap_mix_demo.zip]]&lt;br /&gt;
* Demo eines Synthesizer-Filters: [[Media:dap_filter_demo.zip]]&lt;br /&gt;
* Demo eines 2 Kanal Delays (Der Button &amp;quot;MoveIt!&amp;quot; macht daraus einen Chorus :-))): [[Media:dap_delay_demo.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Quellcodes für das EQ-Demo, das Filter-Demo und das Delay-Demo : [[Media:dap_demos_plus_delphi_source.zip]]&lt;br /&gt;
&lt;br /&gt;
Es folgen noch der Quellcode für den Mischer (hab ich gerade nicht zur Hand) und weitere Demos (ein Synthesizer und eine 4x4 Patchbay mit EQ und was mir sonst noch einfällt. Dann natürlich mit Source-Codes).&lt;br /&gt;
Anhand dieser Beispiele wird auch eine grobe Doku erstellt.&lt;br /&gt;
&lt;br /&gt;
== SVN-Repository ==&lt;br /&gt;
&lt;br /&gt;
 svn co svn://mikrocontroller.net/audiodsp&lt;br /&gt;
&lt;br /&gt;
Ein automatisch aktualisiertes Paket mit den Daten aus dem Repository gibt es unter http://www.mikrocontroller.net/download/audiodsp-snapshot.tar.gz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
&lt;br /&gt;
* 12.07.2007: Es wurde ein generisches Speicherinterfaces welches Wartezyklen im DAP erlaubt implementiert. Dadurch kann man auf die jeweilgen Speicher des Boards eingehen. Z.Z. ist nur ein einfaches Speicherinterface für den asynchronen Betrieb des PSDRAM des Nexys Boards implementiert. Das Interface ermögicht es einen RAM Controller anzuschließen welcher z.&amp;amp;nbsp;B. ein quasi-Multiport RAM darstellt. Getestet wurde der Stand mit dem Nexys-1000 Board.&lt;br /&gt;
&lt;br /&gt;
==To do==&lt;br /&gt;
&lt;br /&gt;
* nähere Zukunft&lt;br /&gt;
** Einen Konfigurationsdialog in die Demo-Programme einarbeiten mit denen man mit den Codecs etwas spielen kann (Line-In Level, Mikrofon-Level, Bypass, Head-Phone Volume) tlw. erledigt. Funktioniert aber nicht richtig, und daher noch nicht eingebaut. Quellcodes dazu sind vorhanden.&lt;br /&gt;
** Doku anhand der Demo-Programme erstellen&lt;br /&gt;
** C-Code schnipsel erstellen&lt;br /&gt;
&lt;br /&gt;
* fernere Zukunft&lt;br /&gt;
** Front-End des DAPs machen, mit dem sich DAP-Programme erstellen lassen, der Koeffizienten-, Daten- und Wellenform-Speicher beschrieben und gelesen werden kann, der Mikro-Code editierbar gemacht wird und noch ein paar Sachen mehr machbar sind&lt;br /&gt;
** weitere Module für den Rahmen (HDD-Core, weitere Routing-Möglichkeiten innerhalb der bisherigen Cores SDSP und Util)&lt;br /&gt;
&lt;br /&gt;
==Diskussion==&lt;br /&gt;
* http://www.mikrocontroller.net/topic/65205&lt;br /&gt;
* http://www.mikrocontroller.net/topic/34376&lt;br /&gt;
&lt;br /&gt;
Falls Interesse an einer Sammelbestellung für die Platinen und Bauteile besteht &lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/144288&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]] &lt;br /&gt;
[[Kategorie:Audio]]&lt;br /&gt;
[[Kategorie:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66880</id>
		<title>Audio-DSP mit Spartan 3-FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66880"/>
		<updated>2012-06-14T22:02:42Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* DAP mit selbstgelötetem FPGA-Board */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [[Benutzer:TheMason]]&lt;br /&gt;
&lt;br /&gt;
==Ziel==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projekts ist es, eine FPGA-basierte Plattform aufzubauen mit der es möglich ist Synthesizer, Effektgeräte, Mischpulte  oder gar ein Harddiskrecording-System zu realisieren.&lt;br /&gt;
&lt;br /&gt;
==Feature-Liste==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften des Audio-Prozessors: &lt;br /&gt;
&lt;br /&gt;
* Oszillatoren&lt;br /&gt;
* Biquads (Filter)&lt;br /&gt;
* Addierer, Schalter, Verstärker (Multiplizierer)&lt;br /&gt;
* Delays&lt;br /&gt;
* Steuerung des Audio-Prozessors via SPI oder RS232&lt;br /&gt;
* 4 Mono Ein- und Ausgänge&lt;br /&gt;
* GPO (General Purpose Outputs) zur Konfiguration der Codecs&lt;br /&gt;
&lt;br /&gt;
==Übersicht==&lt;br /&gt;
[[Bild:Overview_wo_uc.jpg|thumb|500px]]&lt;br /&gt;
Basis des Audio-Systems ist das Xilinx Spartan 3-Development Board. An diesem Board werden 2 Audio-Codecs angschlossen von denen einer als Master und der andere als Slave agiert. Optional kann noch ein Mikrocontroller angeschlossen werden welcher den FPGA per SPI steuert. Da dieses Projekt mittlerweile recht umfangreich geworden ist, kann ich hier nur einen kurzen Umriss des Systems geben. Dabei beschränke ich mich auf die grobe Funktionsweise des Audio-Prozessors, erläutere das Interface (welches ich als Basis für weitere Projekte bereits nutze) und gebe einen kleinen Überblick über die Hardware.&lt;br /&gt;
&lt;br /&gt;
Das System kann (sofern man 2 Audio-Codecs, von denen einer als Master, der andere als Slave arbeitet, angeschlossen und konfiguriert hat) direkt genutzt werden, da der DAP per RS232 gesteuert werden kann. Der Audio-Prozessor startet mit einem Stereo-Tiefpass-Filter der sich auf den ersten Codec bezieht,&lt;br /&gt;
sodass man ein erstes Demo hat (selbst wenn es etwas unspektakulär ist)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nachbau==&lt;br /&gt;
&lt;br /&gt;
Wer sich dieses System nachbauen möchte, benötigt zunächst ein FPGA-Board. Mit dem Spartan-3-Board von Digilent gestaltet sich der Nachbau einfach, weil die Programmier-Dateien für den FPGA direkt für dieses Board verwendet werden können. Nutzer anderer Boards (Xilinx) müssten zuerst die UCF-Datei für die Pins ihres jeweiligen Boards anpassen, und dieses Projekt neu synthetisieren (compilieren). Nutzer von Altera-Boards hingegen müssen die BlockRAM-Instanzen auf die Altera-Architektur anpassen (den Inhalt der RAMs dabei nicht vergessen :-). Vielleicht findet sich ja der eine oder andere der den VHDL Code für Altera-FPGAs portiert.&lt;br /&gt;
Der eigentliche wichtige Teil eines Nachbaus ist der Codec-Teil. Dieses System verwendet zwar zwei Codecs, aber es kann auch mit einem gearbeitet werden. Als Codec kommt der TLV320AIC23B von Texas Instruments zum Einsatz. Diesen kann man als kostenloses Muster bei TI direkt bekommen. &lt;br /&gt;
Des weiteren benötigt man noch eine handvoll Bauteile wie Kondensatoren, Widerstände und einen Quarz. (Ein Codec MUSS als Master laufen, sonst hat das System keine Audio-Clocks, da diese nicht vom FPGA generiert werden)&lt;br /&gt;
Die Initialisierung des Codecs wird vom PC aus gemacht. Dazu dienen die 4 GPO-Leitungen auf dem B1-Verbinder. Da der Codec nur &amp;quot;halbes&amp;quot; SPI unterstüzt (man kann nur schreiben, nicht lesen) gestaltet sich die Initialisierung recht einfach.&lt;br /&gt;
Die 4 GPO-Leitungen teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* Chip-Select Codec 2&lt;br /&gt;
* Chip-Select Codec 1&lt;br /&gt;
* SPI Data Out&lt;br /&gt;
* SPI Clock&lt;br /&gt;
&lt;br /&gt;
==Audio-Prozessor (DAP)==&lt;br /&gt;
&lt;br /&gt;
[[bild:Overview dap core.JPG|thumb|500px|right]]&lt;br /&gt;
&lt;br /&gt;
Der FPGA beinhaltet in dem gesamten System einen Quasi-DSP. Quasi-DSP deshalb, da die Struktur im Gegensatz zu einem DSP bzw. Mikrocontroller keine Verzweigungen, Interrupts oder ähnliches zulässt. Der Audio-Prozessor besteht im wesentlichen aus 3 Teilen : einem Rahmen, einem SDSP (Small DSP)-Kern &lt;br /&gt;
sowie einem Utility-Kern. Beide Kerne können theoretisch parallel arbeiten, da jeder Kern einen eigenen Zustandsautomaten und einen eigenen Microcode-Speicher besitzen. Diese Möglichkeit ist allerdings noch nicht implementiert.&lt;br /&gt;
&lt;br /&gt;
Der SDSP-Kern besteht im wesentlichen aus einer MAC-Einheit, einem Speicher für Audiodaten, einem Koeffizienten-Speicher, einem Adressgenerator und mehreren Muxern, sowie dem schon angesprochenen Zustandsautomaten und dem Microcode. Weiterhin ist ein Hidden-Write- (bzw. Shadow Register) Mechanismus integriert,&lt;br /&gt;
welcher ein &amp;quot;knackserfreies&amp;quot; Aktualisieren von Koeffizienten ermöglicht. Alle diese Komponenten werden vom Microcode aus gesteuert (genau wie bei einem Mikrocontroller). Mit diesem Kern ist es möglich, Audiosignale zu bearbeiten. Zu Den Bearbeitungsmöglichkeiten zählen in erster Linie das Verändern der Lautstärke, Mischen, Filtern (Biquad) sowie Laden und Speichern von &lt;br /&gt;
Audiowerten.&lt;br /&gt;
&lt;br /&gt;
Der Utility-Kern besteht aus einem Akkumulator (für DDS), einem Shaper, einem Adressgenerator, einem Wavetable-Speicher, einem Zufallszahlengenerator, einigen Muxern, (einem Adressgenerator für SRAM, einem SRAM-Controller; diese sind allerdings nur nutzbar, wenn man das ganze mit dem ISE 6.2 synthetisiert) &lt;br /&gt;
und dem schon angesprochenen Zustandsautomaten und dem Microcode. Der Microcode steuert (genau wie beim SDSP-Kern) dabei die einzelnen Komponenten des Utility-Kerns. Dieser Kern ist für das Erzeugen von Audiosignalen zuständig, und erlaubt ein Audiosignal zu verzögern, sofern man die ISE-Version 6.2 verwendet (später dazu mehr). Als Wellenformen stehen Sägezahn, Rechteck (mit veränderbarer Pulsbreite), Rauschen sowie benutzderdefinierbare Wellenformen (Wavetable) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Der Rahmen besteht aus einem Zustandsautomaten, einem Programmspeicher, einigen Muxern, sowie einem doppelten I2S-Sender/Empfänger (für 2 Stereo Ein- und Ausgänge). In den Rahmen werden die beiden Kerne &amp;quot;eingehängt&amp;quot;. Die Kerne werden vom Programmspeicher aus mit Daten versorgt, und vom Zustandsautomaten angesteuert. Der Programmspeicher (PMEM) ist als 512x32 Bit organisiert. Das heißt, dass ein Befehl im Programmspeicher 32 Bit an Informationen enthält und der Audioprozessor max. 512 Befehle umfassen kann.&lt;br /&gt;
&lt;br /&gt;
===SDSP-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:SDSP-Struct.jpg|thumb|300px|left|Struktur des SDSP-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Der eigentliche Kern des DAPs ist die MAC-Einheit. Mit ihr werden die grundlegenden Operationen Multiplikation und Addition durchgeführt. Es ist eine 32x32-Bit-Einheit. &lt;br /&gt;
Die Funktionsweise des Kerns ist eigentlich recht einfach. &lt;br /&gt;
Die MAC-Einheit hat 2 Eingänge. Einer dieser Eingänge kann ein Audiosignal, ein Wert aus dem Audiospeicher (AMEM-BlockRAM) oder ein zuvor berechnetes Ergebnis sein. Der andere Eingang kann ein Koeffizient aus dem CMEM-BlockRAM oder eine Konstante (1.000, 0.000 oder -1.000) sein.&lt;br /&gt;
Der Ausgang (32-Bit, hart geclippt) geht auf das AMEM-BlockRAM und zum Ausgangs-Clipping. Das Ausgangsclipping schneidet das Audiosignal auf 24-Bit zurecht.&lt;br /&gt;
Die Adressen für die Speicher (AMEM und CMEM) werden im Addressgenerator erzeugt. Dieser wird von außen mit einer 8-Bit-Basis-Adresse gespeist und erzeugt einen Offset zu den Eingangsadressen. Er besitzt 2 setzbare Zähler und einige Multiplexer.&lt;br /&gt;
Alle Steuersignale der Komponenten von einem weiteren aus BlockRAM (MMEM) versorgt. Weiterhin wird von außen eine Startadresse vorgegeben. Dadurch lassen sich quasi Opcodes mit von außen vorgegeben Parametern (Adressen) aufrufen.&lt;br /&gt;
Das MMEM-BlockRAM wird nun einfach nur linear ausgelesen bis ein Stopbit gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Util-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Util-Core.jpg|thumb|300px|left|Struktur des Utility-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Beschreibung folgt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opcodes des DAP===&lt;br /&gt;
&lt;br /&gt;
Diese 32 Bit eines Befehls teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* 4 Bit = Opcode (für SDSP und Utility Kern gleich)&lt;br /&gt;
* 2 Bit = noch leer&lt;br /&gt;
* 1 Bit = Core Select (SDSP oder Utility)&lt;br /&gt;
* 1 Bit = Ende des Programms&lt;br /&gt;
* 4 Bit = Eingangsrouting (Kanal 1 - 4, Ergebnis SDSP-Kern, Ergebnis Utility-Kern)&lt;br /&gt;
* 4 Bit = Ausgangsrouting (SDSP-Ausgang auf Kanal 1-4, Utility-Ausgang auf Kanal 1-4)&lt;br /&gt;
* 8 Bit = Adresse 1 (bei SDSP für Audio-Memory, bei Utility-Kern für Datenspeicher)&lt;br /&gt;
* 8 Bit = Adresse 2 (bei SDSP für Koeffizientenspeicher, bei Utility-Kern unbenutzt)&lt;br /&gt;
&lt;br /&gt;
Das Eingangsrouting bestimmt, mit welchem Signal der gewählte Kern arbeiten soll. Dies können die Eingänge 1-4 aber auch ein vorher berechnetes Ergebnis des SDSP- bzw. Utility-Kerns sein. Das Ausgangsrouting bestimmt, von welchem Kern das Signal auf welchen Ausgang geroutet wird.&lt;br /&gt;
&lt;br /&gt;
Die Opcodes des DAPs sind:&lt;br /&gt;
&lt;br /&gt;
SDSP-Kern:&lt;br /&gt;
* Biquad rechnen&lt;br /&gt;
* Audiowert speichern&lt;br /&gt;
* Audiowert laden&lt;br /&gt;
* Move eines Wertes im Audiospeicher&lt;br /&gt;
* Summe rücksetzen&lt;br /&gt;
* Eingang zu Summe addieren&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe addieren&lt;br /&gt;
* Eingang zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Lautstärke &lt;br /&gt;
&lt;br /&gt;
Utility-Kern:&lt;br /&gt;
* Oszillator (DDS-Teil)&lt;br /&gt;
* Waveshaper&lt;br /&gt;
* Verzögerung&lt;br /&gt;
&lt;br /&gt;
Der Ablauf eines Audio-Programms ist folgender:&lt;br /&gt;
&lt;br /&gt;
Sobald ein neues Sample anliegt, wird die Abarbeitung des Programms von Adresse 0x0000 an im PMEM angestoßen. Es wird dabei jeweils ein Befehl geladen und Daten wie Opcode und Adressen liegen dabei an beide Kernen gleichermaßen an. Ist das Programm-Ende-Bit nicht gesetzt, so wird der jeweilige Kern (mit dem im Opcode angegeben Routing) angesteuert. Legt der betreffende Kern sein Ready-Signal auf 1, so wird der nächste Befehl abgearbeitet. Dieses Verhalten (Laden und Verteilen von Opcode-Daten sowie die Ablaufsteuerung, also das Ansteuern des Programms, Ansteuern der einzelnen Kerne, warten auf dessen Abarbeitung und das Programmende) wird vom Rahmen übernommen.&lt;br /&gt;
&lt;br /&gt;
===Speicherorganisation===&lt;br /&gt;
&lt;br /&gt;
Alle Speicher die vom DAP angesprochen werden, haben eine Wortbreite von 32 Bit, der Zugriff erfolgt aber ausschließlich über eine Breite von 8 Bit (Interface).&lt;br /&gt;
&lt;br /&gt;
DAP&lt;br /&gt;
* Programmspeicher 	(PMEM)   0x0000 - 0x07ff&lt;br /&gt;
&lt;br /&gt;
SDSP&lt;br /&gt;
* Audiospeicher   	(AMEM)   von außen nicht zugänglich&lt;br /&gt;
* Koeffizientenspeicher 	(CMEM)   0x2000 - 0x2023  (man &amp;quot;sieht&amp;quot; nur den Hidden Write -&amp;gt; später mehr dazu)&lt;br /&gt;
* Microcodespeicher      (MMEM)   0x4000 - 0x47ff&lt;br /&gt;
&lt;br /&gt;
Utility-Core&lt;br /&gt;
* Datenspeicher          (DMEM)   0x6000 - 0x67ff&lt;br /&gt;
* Wavetable-Speicher      (WMEM)   0x8000 - 0x87ff&lt;br /&gt;
* Microcodespeicher      (UMEM)   0xa000 - 0xa7ff&lt;br /&gt;
&lt;br /&gt;
===Hidden-Write===&lt;br /&gt;
Um bei Änderung der Koeffizienten Knackser zu vermeiden (die dadurch entstehen das der Koeffizient nur teilweise [durch 8-Bit-Zugriffe] geändert wird, währenddessen aber Audio trotzdem noch &amp;quot;weiterläuft&amp;quot; und mit &amp;quot;falschen&amp;quot; Zwischenwerten gerechnet wird), ist ein Mechanismus implementiert, der die zu ändernden Koeffizienten im Hintergund in den Speicher schreibt. Um diesen Mechanismus zu nutzen, müssen zuerst die Koeffizienten in interne Register&lt;br /&gt;
geschrieben werden. Die Register (es sind 8 32-Bit-Register) liegen im Speicherbereich 0x2000 bis 0x201f. Die Speicherstelle 0x2020 gibt die Startadresse innerhalb des Koeffizientenspeichers an. Diese Adresse ist nur 8 Bit breit. Die Speicherstelle 0x2021 gibt an, wieviele der 8 Register übertragen werden sollen. Die Speicherstelle 0x2022 löst den Kopiervorgang aus. Hier reicht es, ein Dummy-Byte zu schreiben. Um den Kopiervorgang zu beenden (MUSS GEMACHT WERDEN!, sonst können keine weiteren Koeffizientenupdates gemacht werden), schreibt man an Speicherstelle 0x2023 ebenfalls ein Dummy-Byte.&lt;br /&gt;
&lt;br /&gt;
===I/O Register===&lt;br /&gt;
&lt;br /&gt;
Es gibt noch einen 8-Bit breiten Adressbereich innerhalb des DAPs, mit dem der I2S-Teil stummgeschaltet werden kann. Weiterhin hat man die Möglichkeit, die Anzahl der Systemtakte pro Sample und die Anzahl der aktiven Systemtakte (also die Zeit die der Audioprozessor beschäftigt ist) zu ermitteln. Dadurch lässt sich eine Auslastungsanzeige des DAPs realisieren.&lt;br /&gt;
&lt;br /&gt;
===Interface===&lt;br /&gt;
&lt;br /&gt;
Um von außen nun ein Programm (bzw. Koeffizienten und Daten) zu laden, ist eine einfach zu handhabende und erweiterbare Schnittstelle implementiert. Die Schnittstelle kann per RS232 (fest eingestellt auf 115,2kBaud) oder per SPI (wird hardwaremäßig eingestellt) angesteuert werden. Die Schnittstelle in ihrer Gesamtheit ist schichtweise aufgebaut und beginnt mit einem Daten-Dispatcher. Dieser Daten-Dispatcher entscheidet (nachdem dieser selektiert wurde) mit dem ersten Byte, an welches angeschlossene Gerät der weitere Datenstrom geleitet wird.&lt;br /&gt;
&lt;br /&gt;
Als angeschlossene Geräte sind im aktuellen Entwurf ein Gerät namens &amp;quot;StdIO&amp;quot; und der Audioprozessor verfügbar.&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;StdIO&amp;quot;-Gerät steuert die 7-Segment-Anzeige (16-Bit-Hexadezimalanzeige oder 32-Bit-Einzelsegmentanzeige) sowie die 8 Leuchtdioden, und erlaubt es, die 3 Drucktaster sowie die 8 Schiebeschalter auszulesen.&lt;br /&gt;
&lt;br /&gt;
Der Audioprozessor besteht (schnittstellenseitig) nur aus einer Speicherzugriffsschnittstelle. Diese Schnittstelle entscheidet mit dem ersten Byte (sobald es selektiert wurde), ob in den Speicher geschrieben, von diesem gelesen, ein I/O-Schreib- oder -Lesezugriff erfolgen soll.&lt;br /&gt;
Die folgenden 2 Bytes (im Falle eines I/O-Zugriffs nur 1 Byte) bestimmen die Adresse und damit den Speicherbereich des Audioprozessors, auf den zugegriffen werden soll. Die Speicherschnittstelle besitzt einen Autoinkrementierer,&lt;br /&gt;
mit dem fortlaufende Bytes einfach hintereinander geschrieben werden können, ohne dass jedes mal wieder der FPGA, das Gerät und die neue Adresse neu geschrieben werden müssen, was den Zugriff erheblich beschleunigt.&lt;br /&gt;
&lt;br /&gt;
Ursprünglich basierte das System auf einem SPI-Interface. Dabei wurde die Chip-Select-Leitung als &amp;quot;globaler&amp;quot; Interface-Reset betrachtet, d.h. war die Leitung auf High, war der FPGA deselektiert und und alle Interface-Zustandsautomaten wurden im Reset gehalten. Erst mit dem Setzen dieser Leitung wurde der FPGA angesprochen. (erstes Byte -&amp;gt; Daten-Dispatcher, folgende Bytes gehen an das ausgewählte Gerät). Weiterhin hat SPI die Eigenschaft, dass mit jedem gesendeten Byte auch eines empfangen wurde. Der Umstand, dass RS232 weder eine Chip-Select Leitung benötigt noch eine synchrone Übertragung erzwingt, führt zu dem Umstand, dass man bei Nutzung von RS232 einige Befehle zusätzlich benötigt. Diese Befehle werden durch das Zeichen 0x1b (ESC) eingeleitet. Soll statt der &amp;quot;Spezialfunktion&amp;quot; das Byte 0x1b übertragen werden, so wird dieses einfach erneut gesendet. Soll die Chip-Select-Leitung gesetzt bzw. gelöscht werden, so wird die Sequenz 0x1b 0x00 (Selektieren) bzw.&lt;br /&gt;
0x1b 0x01 (Deselektieren) gesendet. Soll ein zuvor im Ausgangsregister gesetztes Byte gesendet werden, so muss die Sequenz 0x1b 0x02 gesendet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
0x121b auf dem 7-Segment-Display per RS232 anzeigen:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x00      (Hi-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x12      (Wert 12)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x01      (Lo-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x1b 0x1b (Wert 1b -&amp;gt; zu beachten: wenn der Wert 0x1b übertragen werden soll, muss dieser doppelt gesendet werden !!)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Beispiel, um in den Programmspeicher des Audioprozessors an Adresse 0x0010 das Langwort 0x12233445 zu schreiben:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf1      (DAP selektieren)&lt;br /&gt;
*- 0x00      (Speicher schreiben)&lt;br /&gt;
*- 0x00      &lt;br /&gt;
*- 0x10      (Adresse 0x0010 -&amp;gt; PMEM-Adresse 0x010)&lt;br /&gt;
*- 0x12	    (Adresse 0x0010 -&amp;gt; 0x12)	&lt;br /&gt;
*- 0x23	    (Adresse 0x0011 -&amp;gt; 0x23, autoincrement)&lt;br /&gt;
*- 0x34      (Adresse 0x0012 -&amp;gt; 0x34, autoincrement)&lt;br /&gt;
*- 0x45      (Adresse 0x0013 -&amp;gt; 0x45, autoincrement)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Auslesen der 8 Schalter:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x04      (Schalter auslesen)&lt;br /&gt;
*- 0x00	    (dummy byte -&amp;gt; überträgt Schalterstellung in Ausgaberegister)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man die 8 Schalterstellungen binärcodiert)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Der Datendispatcher (welcher mit dem ersten Byte nach dem Selektieren des FPGAs [0x1b 0x00] angesprochen wird) hat weiterhin einige nützliche Funktionen, die in ihrer Gesamtheit allerdings noch nicht ausführlich getestet wurden. Darunter sind Funktionen, mit denen Informationen über die an den Ports des Daten-Dispatchers angeschlossenen Geräte zu ermitteln. Diese Funktion kann dazu genutzt werden, um zu ermitten, welche Geräte im FPGA implementiert sind und an welchen Ports welche Geräte angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
Anzahl der Ports des Daten-Dispatchers liefern:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xed      (Anzahl Ports lesen)&lt;br /&gt;
*- 0x00      (dummy byte -&amp;gt; überträgt Inhalt des Ausgaberegisters)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man 0x22)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
===DAP-Modul-Schnipsel===&lt;br /&gt;
&lt;br /&gt;
Um mal &amp;quot;eben&amp;quot; mit dem DAP zu spielen, ein paar Schnipsel die sich recht leicht zu kompletten Funktionsblöcken zusammenschließen lassen.&lt;br /&gt;
Es werden hier nur die RS232-Sequenzen mit einer kurzen Erklärung aufgelistet.&lt;br /&gt;
&lt;br /&gt;
*Dual Mono Biquad&lt;br /&gt;
&lt;br /&gt;
*ESC 0x00 - FPGA selektieren&lt;br /&gt;
*0xF1     - DAP auswählen&lt;br /&gt;
*0x00 0x00 0x00 - Memory Write (Adresse 0x0000 -&amp;gt; Program Memory)&lt;br /&gt;
*0x10 0x00 0x00 0x08 - Biquad mit Kanal 1 (0) rechnen (AMEM = 0x00;CMEM = 0x08) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x10 0xf0 0x08 0x10 - Biquad mit vorherigem Ergebnis (0xf) rechnen (AMEM = 0x08; CMEM = 0x10) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x01 0x00 0x00 0x00 - Audioprogramm Ende (wichtig !!!)&lt;br /&gt;
*ESC 0x01 - DAP &amp;amp; FPGA deselektieren&lt;br /&gt;
&lt;br /&gt;
Erklärung :&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Opcodes 0x100008 deutet an, dass ein Biquad durchgerechnet werden soll. Das Eingangsregister 0 bedeutet, dass Kanal 1 des 1. Codecs verwendet wird. Das Ausgangsregister, welches nach Fertigstellung des Ergebnisses benutzt werden soll, ist 0 (-&amp;gt; Kanal 1 des 1. Codecs). Der Teil 0x00 0x08 bedeutet hierbei, dass die Biquad-Koeffizienten im CMEM ab Adresse 0x08 stehen. Die Audio-Zwischenwerte werden in den Audiospeicher AMEM ab Adresse 0x00 gelegt.&lt;br /&gt;
Der zweite Opcode (0x10f00810) rechnet ebenfalls ein Biquad durch. Nur dass hier statt Kanal 1 des Codecs das voher vom SDSP berechnete Ergebnis verwendet werden soll (Kanal 0xf, wenn man so will). Ausgangsregister ist auch hier wieder Kanal 1. Da dieser Biquad unabhängig vom ersten (d.h. mit anderen Parametern) gerechnet werden soll, sind hier logischerweise auch andere Adressen für AMEM (0x08) und CMEM (0x10) angegeben. Die CMEM-Adresse ist dabei etwas unkritischer, da es ja durchaus sein kann, dass ein Audiosignal zweimal mit den selben Biquad-Werten gerechnet werden soll, bzw. unterschiedliche Kanäle mit den selben Biquad-Werten, z.b. bei einem Stereo-Equalizer. Kritischer ist allerdings die Verwendung der AMEM-Adresse. Diese sollte für jede Operation (sofern AMEM denn verwendet wird) unterschiedlich sein, vor allem bei der Berechnung von Biquads. Dies hat den Grund, dass bei Operationen, die dieselben AMEM Adressen haben, die vorher berechneten Werte überschrieben werden. Dies ist bei Biquads gaanz böse (kann u.U. SEHR laut werden), und vom Ergebnis her nicht vorhersagbar.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
[[bild:Fpga_ext_board_schematic_no_uc.JPG|thumb|500px]]&lt;br /&gt;
&lt;br /&gt;
Wie Eingangs erwähnt, benötigt das System eine (bzw. zwei) Audio-Codecs. Im aktuellen Schaltplan wird auf einen Mikroprozessor verzichtet. Dieser diente im System primär zu Initialisierung der Codecs. Dieser Vorgang kann nun vom PC aus gesteuert werden, da in der neuen ISE-6.2-Version 4 Leitungen herausgeführt wurden, welche per RS232 gesetzt und gelöscht werden. &lt;br /&gt;
Wer das System nachbauen möchte, kann entweder die TLV320AIC23B-Codecs oder auch beliebige andere Codecs verwenden, solange einer als Master und der andere als Slave arbeitet und beide auf den I2S-Modus mit 64FS und 20-Bit-Wortlänge eingestellt sind. Die Initialisierung dieser Codecs muss dann aber separat vorgenommen werden (wobei man dann wahrscheinlich nicht um einen uC drumrum kommt). Um das System zu testen (Programme und Koeffizienten in den DAP einzuspielen), wird lediglich eine serielle Schnittstelle verwendet. Wer will, kann aber genausogut den SPI-Modus verwenden und den DAP direkt von einem Mikrocontroller aus steuern. Zur Auswahl der verwendeten Schnittstelle (RS232 oder SPI) wird Pin 13 des B1-Connectors benutzt. Liegt dieser Pin auf GND, so wird der FPGA per RS232 gesteuert. Liegt dieser Pin auf 3.3V, so wird der FPGA per SPI gesteuert.&lt;br /&gt;
&lt;br /&gt;
Hier der Schaltplan meines verwendeten Audio-Boards.&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier noch die Pinbelegung des B1-Erweiterungssteckers:&lt;br /&gt;
&lt;br /&gt;
*01 GND&lt;br /&gt;
*02 VCC 5V&lt;br /&gt;
*03 VCC 3.3V&lt;br /&gt;
*04 N.C.&lt;br /&gt;
*05 SPI_CS - Chip Select (von uC nach FPGA)&lt;br /&gt;
*06 N.C.&lt;br /&gt;
*07 SPI_DI - SPI Data In (von uC nach FPGA)&lt;br /&gt;
*08 BCLK - Bit Clock (von Master Codec)&lt;br /&gt;
*09 SPI_CLK - SPI Clock (von uC nach FPGA)&lt;br /&gt;
*10 LRCLK - LR-Clock (von Master Codec)&lt;br /&gt;
*11 SPI_DO - SPI Data Out (von FPGA nach uC)&lt;br /&gt;
*12 SDOUT1 - zum D/A Wandler (Codec) 1&lt;br /&gt;
*13 IF_SEL - Interface Select (GND = RS232; VCC3.3 = SPI)&lt;br /&gt;
*14 SDIN1 - vom A/D Wandler (Codec) 1&lt;br /&gt;
*15 RXD_OUT - RS232 Signal vom MAX232 zum uC&lt;br /&gt;
*16 SDIN2 - vom A/D Wandler (Codec) 2&lt;br /&gt;
*17 TXD_IN - RS232 Signal vom uC zum MAX232&lt;br /&gt;
*18 SDOUT2 - zum D/A Wandler (Codec) 2&lt;br /&gt;
*19 GPO 3 - Chip-Select Codec 2&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 2 - Chip-Select Codec 1&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 1 - SPI-Data out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 0 - SPI-Clock Out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
&lt;br /&gt;
==Nexys Board==&lt;br /&gt;
&lt;br /&gt;
Im SVN Repository (s.u.) gibt es eine Version des DAPs für das Nexys Board.&lt;br /&gt;
Diese ist voll SW-Kompatibel zum alten Spartan 3 Board (allerdings z.Z. nur über RS232 steuerbar). Neu bei der Version ist das das Speicherinterface generisch ausgelegt wurde und ein einfacher SRAM-Controller für das Nexys Board PSDRAM geschrieben wurde. Durch das generische Interface ist es möglich andere Speicherarten anzubinden. Der verwendete Codec ist wie schon im bisherigen Projekt der TLV320AIC23B. Dieser wird via RS232 (6-pin Port A des Nexys Boards) über die GPO Leitungen (6-pin Port D des Nexys Boards) initialisiert. Die eigentlichen Datenleitungen des Codecs liegen an Port B (BCLK, LRCLK, DIN, DOUT).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download des DAP als MCS-File für das Nexys-1000 Board : [[Media:Nexys_dap.zip]]&lt;br /&gt;
&lt;br /&gt;
Diese Version ist voll lauffähig (wurde mit den Demos getestet).&lt;br /&gt;
Die Pin Belegung für die RS232 und den Audio-Codec ist wie folgt :&lt;br /&gt;
&lt;br /&gt;
Header A : RS232 Schnittstelle&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Pin 1 : RxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : TxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V/5V für MAX232/MAX3232)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header B : I2S Schnittstelle für 1 Codec&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : BitClk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : L/R Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : SDIN&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : SDOUT&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V für den Codec)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header D : Codec-Konfiguration via SPI&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : Codec 2 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : Codec 1 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : Codec SPI Data&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : Codec SPI Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DAP mit selbstgelötetem FPGA-Board==&lt;br /&gt;
&lt;br /&gt;
Auf einen Beitrag von Thomas Pototschnig hin bin ich auf sein selbstentworfenes Spartan-3-FPGA-Board (Grafikkarte) aufmerksam geworden. Thomas hat mir die Erlaubnis gegeben dieses Board für den DAP verwenden zu können und die Schaltpläne hier zu veröffentlichen. Nachdem ich von ihm noch einige Vorversionen (nur die Platinen) ergattern konnte und diese erfolgreich aufgebaut (mit Spartan 3-200 und -400) habe, bin ich von diesem Board echt begeistert. Danke nochmals.&lt;br /&gt;
&lt;br /&gt;
[[Bild:FPGA-Board.jpg|thumb|300px|left]]&lt;br /&gt;
&lt;br /&gt;
Hier Schaltplan und Layout. &lt;br /&gt;
&lt;br /&gt;
[[Media:miniFPGA-Board.zip]]&lt;br /&gt;
&lt;br /&gt;
Das Board ist zweiseitig und die &amp;quot;schlimmsten&amp;quot; zu lötenden Bauteile sind lediglich der FPGA (QFP-144) und die beiden RAMs (SOJ36, ekelig). Der Rest ist recht einfach. Auch die Inbetriebnahme des Boards gestaltete sich problemlos.&lt;br /&gt;
&lt;br /&gt;
Den Quellcode für den DAP musste ich etwas ändern und abspecken. Durch den ineffizienten VHDL-Code der MAC-Einheit gestaltete es sich schwierig, den Entwurf synthetisierbar zu machen. Das Synthetisieren auf einem FT256 gestaltete sich einfacher. Hier ist noch dergestalt Handlungsbedarf, dass die MAC-Einheit überarbeitet werden muss. &lt;br /&gt;
Der abgespeckte Entwurf läuft auf dem FPGA-Board mit einem Spartan 3-400 sowie auf einem Spartan 3-200. &lt;br /&gt;
Den Audio-Codec, das FPGA Board, einen AVR und noch etwas IO-Kram habe ich auf eine Lochrasterplatine aufgebaut. Was noch fehlt, sind MIDI- und SD/MMC-Karten-Schnittstellen. Dann hat man eine schöne Plattform für Synthesizer und Effektgeräte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anmerkung==&lt;br /&gt;
&lt;br /&gt;
Da wie schon gesagt das Projekt komplett auf meinem &amp;quot;Mist&amp;quot; gewachsen ist wird es wohl noch eine Weile dauern bis alles was den DAP betrifft hier in diesem Artikel (und auch in einem Dokumentations-PDF) eingearbeitet ist. Ich werde (sofern ich Zeit dazu habe) noch ein Delphi Programm mit Source-Code einstellen, welche den DAP richtig nutzbar macht und man dann direkt damit &amp;quot;spielen&amp;quot; kann. Eine umfangreiche und vollständige Dokumentation würde momentan einfach zu viel Zeit in Anspruch nehmen und ich möchte langsam das Projekt Vorstellen um Anregung, Kritik und Verbesserungsvorschläge ernten zu können. Ich hoffe noch Leute zu finden um diesem Projekt noch mehr Leben und Möglichkeiten einhauchen zu können.&lt;br /&gt;
&lt;br /&gt;
==Fotos==&lt;br /&gt;
&lt;br /&gt;
Ursprüngliche Version:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Gesamt_wo_uc.jpg|thumb|200px|left|Spartan3 Board und Expansion Board]]&lt;br /&gt;
[[Bild:Codecs.jpg|thumb|200px|left|Expansion Board]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nexys-Board:&lt;br /&gt;
[[Bild:dap_nexys_v1.jpg|thumb|200px|left|Nexys Board mit 1 Audio-Codec]]&lt;br /&gt;
[[Bild:Nexys-board-gesamt.jpg|thumb|200px|left|Nexys Board mit Lochraster-Board und 2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
[[Bild:Nexys-board-codecs-1.jpg|thumb|200px|left|2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufbau von [[Benutzer:Andreas]]:&lt;br /&gt;
[[Bild:Nexys-Audio-DSP-Foto-Andreas.jpg|thumb|600px|left|Nexys + Breadboard + 1 [[Audio Codec Board]]]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Synth-gesamt-klein.jpg|thumb|500px|left|Aufbau des DAPs mit FPGA-Board (entworfen von Thomas Pototschnig) auf Lochraster an AVR, Codec und weiterer IO]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap-Synth-01.jpg|thumb|300px|left|Synth Board. DAP mit AVR,Codec, MIDI Interface, RS232 (schaltbar) und LCD]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_Ansicht_02.jpg|thumb|300px|left|Synth Board. Komplettansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_klein_3.jpg|thumb|600px|left|Synth Board. Synth-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Oben.jpg|thumb|300px|left|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Unten.jpg|thumb|300px|right|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Träger-und-Mainboard.jpg|thumb|600px|left|Selbstgeroutetes DAP-Board auf Trägerplatine]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Seite.jpg|thumb|300px|left|DAP-Board mit Touch-Display Seitenansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display.jpg|thumb|600px|left|DAP-Board mit Touch-Display]]&lt;br /&gt;
&lt;br /&gt;
Diese Version des DAP hat ein Grafikdisplay incl. Touchpanel. Die Ansteuerung übernimmt der FPGA. Dort ist einer kleiner &amp;quot;Grafik-Prozessor&amp;quot; integriert der das Update des Displays und das Kopieren der Bitmaps übernimmt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synthesizer Ansicht 1.jpg|thumb|600px|left|]]&lt;br /&gt;
Synth-Board. Komplettansicht in einem Cherry-Tastaturgehäuse (wie dafür gemacht :-)) im Synthesizer-Stil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synth Komplett.jpg|thumb|600px|left|Fertige Version des DAP als Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
Der komplette Synthesizer mit schicker Frontplatte und passendem (oben schon erwähnten :-)) Cherry-Tastatur-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Version 1.5.jpg|thumb|600px|left|Heue Hardware Version der DAP Hauptplatine]]&lt;br /&gt;
&lt;br /&gt;
Diese Version beinhaltet folgendes : :-) &lt;br /&gt;
&lt;br /&gt;
 - Xilinx XC3S400&lt;br /&gt;
 - ATmega2561&lt;br /&gt;
&lt;br /&gt;
 - 16 MByte (8Mx16) SDRAM&lt;br /&gt;
 - µSD Card Slot&lt;br /&gt;
 - AT45DB321 DataFlash&lt;br /&gt;
 - 24C512 EEProm&lt;br /&gt;
&lt;br /&gt;
 - TLC320AI23B Audio Codec mit Kopfhörer Ausgang&lt;br /&gt;
 - CS5343 A/D Wandler&lt;br /&gt;
 - CS4344 D/A Wandler&lt;br /&gt;
&lt;br /&gt;
 - MIDI&lt;br /&gt;
 - RS232&lt;br /&gt;
 - etlichen IO-Pins vom AVR und FPGA&lt;br /&gt;
 - 2 separaten Clock-Oszillatoren (nicht bestückt)&lt;br /&gt;
&lt;br /&gt;
... und weiterem Kleinkram (LevelShifter, LDO, Platformflash, usw ... und vielen 100nFern)&lt;br /&gt;
&lt;br /&gt;
Ideal zum Aufbau einer Audio-Platform. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audio Demos==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein EQ-Demo mit Rosa Rauschen. Klingt wie eine Meeresbrandung.&lt;br /&gt;
&lt;br /&gt;
[[Media:eq_demo1.zip]]&lt;br /&gt;
&lt;br /&gt;
Der DAP als Synth. Der DAP wird komplett vom PC aus gesteuert (Hüllkurve, Sequencer und Filterberechnung werden im PC gemacht).&lt;br /&gt;
&lt;br /&gt;
[[Media:synthdemo1.wav.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MC505 Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen von meiner Roland-MC505 Groovebox. Es wird einfach nur ein Werkspreset abgespielt und durch den DAP gejagt.&lt;br /&gt;
&lt;br /&gt;
* [[Media:mc505-eq-demo.wav.zip|EQ-Demo]]&lt;br /&gt;
* [[Media:mc505-filter-demo.wav.zip|Filter-Demo (Tiefpass/Hochpass/Notch)]]&lt;br /&gt;
* [[Media:mc505-delay-demo.wav.zip|Delay-Demo (137BPM [657ms &amp;amp; 876 ms]/Chorus)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Synth Board Audio Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen vom DAP in Verbindung mit einem AVR der die Filterkoeffizientenberechnung sowie eine komplette Synthesizer-Steuerung beinhaltet, also qausi einen Synthesizer aus dem DAP macht (inkl. MIDI-Steuerung).&lt;br /&gt;
&lt;br /&gt;
MIDI-Sequenz und Tiefpass-Filter (Filter und Modulation über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-01.mp3]]&lt;br /&gt;
&lt;br /&gt;
Diesselbe MIDI-Sequenz mit Hochpass-Filter (Filter und Modulation ebenfalls über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-02.mp3]]&lt;br /&gt;
&lt;br /&gt;
Ein eher Techno-ähnliches Demo, welches die Auflösung des Systems (DAP+AVR+MIDI) ein wenig zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap_syn_demo_03.mp3]]&lt;br /&gt;
&lt;br /&gt;
==Delphi Tools==&lt;br /&gt;
&lt;br /&gt;
Um den DAP nutzbar zu machen benötigt man entweder ein uC Programm oder ein PC Programm. Da das verwenden von PC-Programmen einfacher fürs Spielen und Experimentieren ist, werde ich hier im Laufe der Zeit kleine Demo-Programme aber auch komplette Front-Ends für den DAP reinstellen. Die Delphi-Programme sind allesamt in Turbo-Delphi geschrieben und die dazugehörigen Quellcodes werden ebenfalls im Laufe der Zeit geuploaded. Ich werde allerdings zuerst noch das Feature des Konfigurierens der Codecs vom PC aus einbauen. &lt;br /&gt;
Nachtrag zum Konfigurieren des Codecs : Prinzipiell funktioniert es, allerdings ist das mit häßlichen Nebengeräuschen verbunden, da ich bei jeder Änderung der Lautstärke im Codec, diesen auch Resetten muß, da sonst immer beide Codecs beschrieben werden, was unschön ist. Warum dies so ist kann ich leider nicht sagen, da ich keine Möglichkeit habe die SPI-Leitungen mitzusniffen (bräuchte dafür einen kleinen LA, den ich nicht habe). &lt;br /&gt;
&lt;br /&gt;
* Demo eines 3 Band Stereo Equalizers. (Der Knopf &amp;quot;MoveIt!&amp;quot; bringt Leben ins Demo): [[Media:dap_eq_demo.zip]]&lt;br /&gt;
* Demo eines 4 Kanal Mono Mixers mit Monitor (Vorhör)-Ausgang: [[Media:dap_mix_demo.zip]]&lt;br /&gt;
* Demo eines Synthesizer-Filters: [[Media:dap_filter_demo.zip]]&lt;br /&gt;
* Demo eines 2 Kanal Delays (Der Button &amp;quot;MoveIt!&amp;quot; macht daraus einen Chorus :-))): [[Media:dap_delay_demo.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Quellcodes für das EQ-Demo, das Filter-Demo und das Delay-Demo : [[Media:dap_demos_plus_delphi_source.zip]]&lt;br /&gt;
&lt;br /&gt;
Es folgen noch der Quellcode für den Mischer (hab ich gerade nicht zur Hand) und weitere Demos (ein Synthesizer und eine 4x4 Patchbay mit EQ und was mir sonst noch einfällt. Dann natürlich mit Source-Codes).&lt;br /&gt;
Anhand dieser Beispiele wird auch eine grobe Doku erstellt.&lt;br /&gt;
&lt;br /&gt;
== SVN-Repository ==&lt;br /&gt;
&lt;br /&gt;
 svn co svn://mikrocontroller.net/audiodsp&lt;br /&gt;
&lt;br /&gt;
Ein automatisch aktualisiertes Paket mit den Daten aus dem Repository gibt es unter http://www.mikrocontroller.net/download/audiodsp-snapshot.tar.gz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
&lt;br /&gt;
* 12.07.2007: Es wurde ein generisches Speicherinterfaces welches Wartezyklen im DAP erlaubt implementiert. Dadurch kann man auf die jeweilgen Speicher des Boards eingehen. Z.Z. ist nur ein einfaches Speicherinterface für den asynchronen Betrieb des PSDRAM des Nexys Boards implementiert. Das Interface ermögicht es einen RAM Controller anzuschließen welcher z.&amp;amp;nbsp;B. ein quasi-Multiport RAM darstellt. Getestet wurde der Stand mit dem Nexys-1000 Board.&lt;br /&gt;
&lt;br /&gt;
==To do==&lt;br /&gt;
&lt;br /&gt;
* nähere Zukunft&lt;br /&gt;
** Einen Konfigurationsdialog in die Demo-Programme einarbeiten mit denen man mit den Codecs etwas spielen kann (Line-In Level, Mikrofon-Level, Bypass, Head-Phone Volume) tlw. erledigt. Funktioniert aber nicht richtig, und daher noch nicht eingebaut. Quellcodes dazu sind vorhanden.&lt;br /&gt;
** Doku anhand der Demo-Programme erstellen&lt;br /&gt;
** C-Code schnipsel erstellen&lt;br /&gt;
&lt;br /&gt;
* fernere Zukunft&lt;br /&gt;
** Front-End des DAPs machen, mit dem sich DAP-Programme erstellen lassen, der Koeffizienten-, Daten- und Wellenform-Speicher beschrieben und gelesen werden kann, der Mikro-Code editierbar gemacht wird und noch ein paar Sachen mehr machbar sind&lt;br /&gt;
** weitere Module für den Rahmen (HDD-Core, weitere Routing-Möglichkeiten innerhalb der bisherigen Cores SDSP und Util)&lt;br /&gt;
&lt;br /&gt;
==Diskussion==&lt;br /&gt;
* http://www.mikrocontroller.net/topic/65205&lt;br /&gt;
* http://www.mikrocontroller.net/topic/34376&lt;br /&gt;
&lt;br /&gt;
Falls Interesse an einer Sammelbestellung für die Platinen und Bauteile besteht &lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/144288&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]] &lt;br /&gt;
[[Kategorie:Audio]]&lt;br /&gt;
[[Kategorie:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66879</id>
		<title>Audio-DSP mit Spartan 3-FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66879"/>
		<updated>2012-06-14T22:00:38Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [[Benutzer:TheMason]]&lt;br /&gt;
&lt;br /&gt;
==Ziel==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projekts ist es, eine FPGA-basierte Plattform aufzubauen mit der es möglich ist Synthesizer, Effektgeräte, Mischpulte  oder gar ein Harddiskrecording-System zu realisieren.&lt;br /&gt;
&lt;br /&gt;
==Feature-Liste==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften des Audio-Prozessors: &lt;br /&gt;
&lt;br /&gt;
* Oszillatoren&lt;br /&gt;
* Biquads (Filter)&lt;br /&gt;
* Addierer, Schalter, Verstärker (Multiplizierer)&lt;br /&gt;
* Delays&lt;br /&gt;
* Steuerung des Audio-Prozessors via SPI oder RS232&lt;br /&gt;
* 4 Mono Ein- und Ausgänge&lt;br /&gt;
* GPO (General Purpose Outputs) zur Konfiguration der Codecs&lt;br /&gt;
&lt;br /&gt;
==Übersicht==&lt;br /&gt;
[[Bild:Overview_wo_uc.jpg|thumb|500px]]&lt;br /&gt;
Basis des Audio-Systems ist das Xilinx Spartan 3-Development Board. An diesem Board werden 2 Audio-Codecs angschlossen von denen einer als Master und der andere als Slave agiert. Optional kann noch ein Mikrocontroller angeschlossen werden welcher den FPGA per SPI steuert. Da dieses Projekt mittlerweile recht umfangreich geworden ist, kann ich hier nur einen kurzen Umriss des Systems geben. Dabei beschränke ich mich auf die grobe Funktionsweise des Audio-Prozessors, erläutere das Interface (welches ich als Basis für weitere Projekte bereits nutze) und gebe einen kleinen Überblick über die Hardware.&lt;br /&gt;
&lt;br /&gt;
Das System kann (sofern man 2 Audio-Codecs, von denen einer als Master, der andere als Slave arbeitet, angeschlossen und konfiguriert hat) direkt genutzt werden, da der DAP per RS232 gesteuert werden kann. Der Audio-Prozessor startet mit einem Stereo-Tiefpass-Filter der sich auf den ersten Codec bezieht,&lt;br /&gt;
sodass man ein erstes Demo hat (selbst wenn es etwas unspektakulär ist)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nachbau==&lt;br /&gt;
&lt;br /&gt;
Wer sich dieses System nachbauen möchte, benötigt zunächst ein FPGA-Board. Mit dem Spartan-3-Board von Digilent gestaltet sich der Nachbau einfach, weil die Programmier-Dateien für den FPGA direkt für dieses Board verwendet werden können. Nutzer anderer Boards (Xilinx) müssten zuerst die UCF-Datei für die Pins ihres jeweiligen Boards anpassen, und dieses Projekt neu synthetisieren (compilieren). Nutzer von Altera-Boards hingegen müssen die BlockRAM-Instanzen auf die Altera-Architektur anpassen (den Inhalt der RAMs dabei nicht vergessen :-). Vielleicht findet sich ja der eine oder andere der den VHDL Code für Altera-FPGAs portiert.&lt;br /&gt;
Der eigentliche wichtige Teil eines Nachbaus ist der Codec-Teil. Dieses System verwendet zwar zwei Codecs, aber es kann auch mit einem gearbeitet werden. Als Codec kommt der TLV320AIC23B von Texas Instruments zum Einsatz. Diesen kann man als kostenloses Muster bei TI direkt bekommen. &lt;br /&gt;
Des weiteren benötigt man noch eine handvoll Bauteile wie Kondensatoren, Widerstände und einen Quarz. (Ein Codec MUSS als Master laufen, sonst hat das System keine Audio-Clocks, da diese nicht vom FPGA generiert werden)&lt;br /&gt;
Die Initialisierung des Codecs wird vom PC aus gemacht. Dazu dienen die 4 GPO-Leitungen auf dem B1-Verbinder. Da der Codec nur &amp;quot;halbes&amp;quot; SPI unterstüzt (man kann nur schreiben, nicht lesen) gestaltet sich die Initialisierung recht einfach.&lt;br /&gt;
Die 4 GPO-Leitungen teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* Chip-Select Codec 2&lt;br /&gt;
* Chip-Select Codec 1&lt;br /&gt;
* SPI Data Out&lt;br /&gt;
* SPI Clock&lt;br /&gt;
&lt;br /&gt;
==Audio-Prozessor (DAP)==&lt;br /&gt;
&lt;br /&gt;
[[bild:Overview dap core.JPG|thumb|500px|right]]&lt;br /&gt;
&lt;br /&gt;
Der FPGA beinhaltet in dem gesamten System einen Quasi-DSP. Quasi-DSP deshalb, da die Struktur im Gegensatz zu einem DSP bzw. Mikrocontroller keine Verzweigungen, Interrupts oder ähnliches zulässt. Der Audio-Prozessor besteht im wesentlichen aus 3 Teilen : einem Rahmen, einem SDSP (Small DSP)-Kern &lt;br /&gt;
sowie einem Utility-Kern. Beide Kerne können theoretisch parallel arbeiten, da jeder Kern einen eigenen Zustandsautomaten und einen eigenen Microcode-Speicher besitzen. Diese Möglichkeit ist allerdings noch nicht implementiert.&lt;br /&gt;
&lt;br /&gt;
Der SDSP-Kern besteht im wesentlichen aus einer MAC-Einheit, einem Speicher für Audiodaten, einem Koeffizienten-Speicher, einem Adressgenerator und mehreren Muxern, sowie dem schon angesprochenen Zustandsautomaten und dem Microcode. Weiterhin ist ein Hidden-Write- (bzw. Shadow Register) Mechanismus integriert,&lt;br /&gt;
welcher ein &amp;quot;knackserfreies&amp;quot; Aktualisieren von Koeffizienten ermöglicht. Alle diese Komponenten werden vom Microcode aus gesteuert (genau wie bei einem Mikrocontroller). Mit diesem Kern ist es möglich, Audiosignale zu bearbeiten. Zu Den Bearbeitungsmöglichkeiten zählen in erster Linie das Verändern der Lautstärke, Mischen, Filtern (Biquad) sowie Laden und Speichern von &lt;br /&gt;
Audiowerten.&lt;br /&gt;
&lt;br /&gt;
Der Utility-Kern besteht aus einem Akkumulator (für DDS), einem Shaper, einem Adressgenerator, einem Wavetable-Speicher, einem Zufallszahlengenerator, einigen Muxern, (einem Adressgenerator für SRAM, einem SRAM-Controller; diese sind allerdings nur nutzbar, wenn man das ganze mit dem ISE 6.2 synthetisiert) &lt;br /&gt;
und dem schon angesprochenen Zustandsautomaten und dem Microcode. Der Microcode steuert (genau wie beim SDSP-Kern) dabei die einzelnen Komponenten des Utility-Kerns. Dieser Kern ist für das Erzeugen von Audiosignalen zuständig, und erlaubt ein Audiosignal zu verzögern, sofern man die ISE-Version 6.2 verwendet (später dazu mehr). Als Wellenformen stehen Sägezahn, Rechteck (mit veränderbarer Pulsbreite), Rauschen sowie benutzderdefinierbare Wellenformen (Wavetable) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Der Rahmen besteht aus einem Zustandsautomaten, einem Programmspeicher, einigen Muxern, sowie einem doppelten I2S-Sender/Empfänger (für 2 Stereo Ein- und Ausgänge). In den Rahmen werden die beiden Kerne &amp;quot;eingehängt&amp;quot;. Die Kerne werden vom Programmspeicher aus mit Daten versorgt, und vom Zustandsautomaten angesteuert. Der Programmspeicher (PMEM) ist als 512x32 Bit organisiert. Das heißt, dass ein Befehl im Programmspeicher 32 Bit an Informationen enthält und der Audioprozessor max. 512 Befehle umfassen kann.&lt;br /&gt;
&lt;br /&gt;
===SDSP-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:SDSP-Struct.jpg|thumb|300px|left|Struktur des SDSP-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Der eigentliche Kern des DAPs ist die MAC-Einheit. Mit ihr werden die grundlegenden Operationen Multiplikation und Addition durchgeführt. Es ist eine 32x32-Bit-Einheit. &lt;br /&gt;
Die Funktionsweise des Kerns ist eigentlich recht einfach. &lt;br /&gt;
Die MAC-Einheit hat 2 Eingänge. Einer dieser Eingänge kann ein Audiosignal, ein Wert aus dem Audiospeicher (AMEM-BlockRAM) oder ein zuvor berechnetes Ergebnis sein. Der andere Eingang kann ein Koeffizient aus dem CMEM-BlockRAM oder eine Konstante (1.000, 0.000 oder -1.000) sein.&lt;br /&gt;
Der Ausgang (32-Bit, hart geclippt) geht auf das AMEM-BlockRAM und zum Ausgangs-Clipping. Das Ausgangsclipping schneidet das Audiosignal auf 24-Bit zurecht.&lt;br /&gt;
Die Adressen für die Speicher (AMEM und CMEM) werden im Addressgenerator erzeugt. Dieser wird von außen mit einer 8-Bit-Basis-Adresse gespeist und erzeugt einen Offset zu den Eingangsadressen. Er besitzt 2 setzbare Zähler und einige Multiplexer.&lt;br /&gt;
Alle Steuersignale der Komponenten von einem weiteren aus BlockRAM (MMEM) versorgt. Weiterhin wird von außen eine Startadresse vorgegeben. Dadurch lassen sich quasi Opcodes mit von außen vorgegeben Parametern (Adressen) aufrufen.&lt;br /&gt;
Das MMEM-BlockRAM wird nun einfach nur linear ausgelesen bis ein Stopbit gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Util-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Util-Core.jpg|thumb|300px|left|Struktur des Utility-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Beschreibung folgt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opcodes des DAP===&lt;br /&gt;
&lt;br /&gt;
Diese 32 Bit eines Befehls teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* 4 Bit = Opcode (für SDSP und Utility Kern gleich)&lt;br /&gt;
* 2 Bit = noch leer&lt;br /&gt;
* 1 Bit = Core Select (SDSP oder Utility)&lt;br /&gt;
* 1 Bit = Ende des Programms&lt;br /&gt;
* 4 Bit = Eingangsrouting (Kanal 1 - 4, Ergebnis SDSP-Kern, Ergebnis Utility-Kern)&lt;br /&gt;
* 4 Bit = Ausgangsrouting (SDSP-Ausgang auf Kanal 1-4, Utility-Ausgang auf Kanal 1-4)&lt;br /&gt;
* 8 Bit = Adresse 1 (bei SDSP für Audio-Memory, bei Utility-Kern für Datenspeicher)&lt;br /&gt;
* 8 Bit = Adresse 2 (bei SDSP für Koeffizientenspeicher, bei Utility-Kern unbenutzt)&lt;br /&gt;
&lt;br /&gt;
Das Eingangsrouting bestimmt, mit welchem Signal der gewählte Kern arbeiten soll. Dies können die Eingänge 1-4 aber auch ein vorher berechnetes Ergebnis des SDSP- bzw. Utility-Kerns sein. Das Ausgangsrouting bestimmt, von welchem Kern das Signal auf welchen Ausgang geroutet wird.&lt;br /&gt;
&lt;br /&gt;
Die Opcodes des DAPs sind:&lt;br /&gt;
&lt;br /&gt;
SDSP-Kern:&lt;br /&gt;
* Biquad rechnen&lt;br /&gt;
* Audiowert speichern&lt;br /&gt;
* Audiowert laden&lt;br /&gt;
* Move eines Wertes im Audiospeicher&lt;br /&gt;
* Summe rücksetzen&lt;br /&gt;
* Eingang zu Summe addieren&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe addieren&lt;br /&gt;
* Eingang zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Lautstärke &lt;br /&gt;
&lt;br /&gt;
Utility-Kern:&lt;br /&gt;
* Oszillator (DDS-Teil)&lt;br /&gt;
* Waveshaper&lt;br /&gt;
* Verzögerung&lt;br /&gt;
&lt;br /&gt;
Der Ablauf eines Audio-Programms ist folgender:&lt;br /&gt;
&lt;br /&gt;
Sobald ein neues Sample anliegt, wird die Abarbeitung des Programms von Adresse 0x0000 an im PMEM angestoßen. Es wird dabei jeweils ein Befehl geladen und Daten wie Opcode und Adressen liegen dabei an beide Kernen gleichermaßen an. Ist das Programm-Ende-Bit nicht gesetzt, so wird der jeweilige Kern (mit dem im Opcode angegeben Routing) angesteuert. Legt der betreffende Kern sein Ready-Signal auf 1, so wird der nächste Befehl abgearbeitet. Dieses Verhalten (Laden und Verteilen von Opcode-Daten sowie die Ablaufsteuerung, also das Ansteuern des Programms, Ansteuern der einzelnen Kerne, warten auf dessen Abarbeitung und das Programmende) wird vom Rahmen übernommen.&lt;br /&gt;
&lt;br /&gt;
===Speicherorganisation===&lt;br /&gt;
&lt;br /&gt;
Alle Speicher die vom DAP angesprochen werden, haben eine Wortbreite von 32 Bit, der Zugriff erfolgt aber ausschließlich über eine Breite von 8 Bit (Interface).&lt;br /&gt;
&lt;br /&gt;
DAP&lt;br /&gt;
* Programmspeicher 	(PMEM)   0x0000 - 0x07ff&lt;br /&gt;
&lt;br /&gt;
SDSP&lt;br /&gt;
* Audiospeicher   	(AMEM)   von außen nicht zugänglich&lt;br /&gt;
* Koeffizientenspeicher 	(CMEM)   0x2000 - 0x2023  (man &amp;quot;sieht&amp;quot; nur den Hidden Write -&amp;gt; später mehr dazu)&lt;br /&gt;
* Microcodespeicher      (MMEM)   0x4000 - 0x47ff&lt;br /&gt;
&lt;br /&gt;
Utility-Core&lt;br /&gt;
* Datenspeicher          (DMEM)   0x6000 - 0x67ff&lt;br /&gt;
* Wavetable-Speicher      (WMEM)   0x8000 - 0x87ff&lt;br /&gt;
* Microcodespeicher      (UMEM)   0xa000 - 0xa7ff&lt;br /&gt;
&lt;br /&gt;
===Hidden-Write===&lt;br /&gt;
Um bei Änderung der Koeffizienten Knackser zu vermeiden (die dadurch entstehen das der Koeffizient nur teilweise [durch 8-Bit-Zugriffe] geändert wird, währenddessen aber Audio trotzdem noch &amp;quot;weiterläuft&amp;quot; und mit &amp;quot;falschen&amp;quot; Zwischenwerten gerechnet wird), ist ein Mechanismus implementiert, der die zu ändernden Koeffizienten im Hintergund in den Speicher schreibt. Um diesen Mechanismus zu nutzen, müssen zuerst die Koeffizienten in interne Register&lt;br /&gt;
geschrieben werden. Die Register (es sind 8 32-Bit-Register) liegen im Speicherbereich 0x2000 bis 0x201f. Die Speicherstelle 0x2020 gibt die Startadresse innerhalb des Koeffizientenspeichers an. Diese Adresse ist nur 8 Bit breit. Die Speicherstelle 0x2021 gibt an, wieviele der 8 Register übertragen werden sollen. Die Speicherstelle 0x2022 löst den Kopiervorgang aus. Hier reicht es, ein Dummy-Byte zu schreiben. Um den Kopiervorgang zu beenden (MUSS GEMACHT WERDEN!, sonst können keine weiteren Koeffizientenupdates gemacht werden), schreibt man an Speicherstelle 0x2023 ebenfalls ein Dummy-Byte.&lt;br /&gt;
&lt;br /&gt;
===I/O Register===&lt;br /&gt;
&lt;br /&gt;
Es gibt noch einen 8-Bit breiten Adressbereich innerhalb des DAPs, mit dem der I2S-Teil stummgeschaltet werden kann. Weiterhin hat man die Möglichkeit, die Anzahl der Systemtakte pro Sample und die Anzahl der aktiven Systemtakte (also die Zeit die der Audioprozessor beschäftigt ist) zu ermitteln. Dadurch lässt sich eine Auslastungsanzeige des DAPs realisieren.&lt;br /&gt;
&lt;br /&gt;
===Interface===&lt;br /&gt;
&lt;br /&gt;
Um von außen nun ein Programm (bzw. Koeffizienten und Daten) zu laden, ist eine einfach zu handhabende und erweiterbare Schnittstelle implementiert. Die Schnittstelle kann per RS232 (fest eingestellt auf 115,2kBaud) oder per SPI (wird hardwaremäßig eingestellt) angesteuert werden. Die Schnittstelle in ihrer Gesamtheit ist schichtweise aufgebaut und beginnt mit einem Daten-Dispatcher. Dieser Daten-Dispatcher entscheidet (nachdem dieser selektiert wurde) mit dem ersten Byte, an welches angeschlossene Gerät der weitere Datenstrom geleitet wird.&lt;br /&gt;
&lt;br /&gt;
Als angeschlossene Geräte sind im aktuellen Entwurf ein Gerät namens &amp;quot;StdIO&amp;quot; und der Audioprozessor verfügbar.&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;StdIO&amp;quot;-Gerät steuert die 7-Segment-Anzeige (16-Bit-Hexadezimalanzeige oder 32-Bit-Einzelsegmentanzeige) sowie die 8 Leuchtdioden, und erlaubt es, die 3 Drucktaster sowie die 8 Schiebeschalter auszulesen.&lt;br /&gt;
&lt;br /&gt;
Der Audioprozessor besteht (schnittstellenseitig) nur aus einer Speicherzugriffsschnittstelle. Diese Schnittstelle entscheidet mit dem ersten Byte (sobald es selektiert wurde), ob in den Speicher geschrieben, von diesem gelesen, ein I/O-Schreib- oder -Lesezugriff erfolgen soll.&lt;br /&gt;
Die folgenden 2 Bytes (im Falle eines I/O-Zugriffs nur 1 Byte) bestimmen die Adresse und damit den Speicherbereich des Audioprozessors, auf den zugegriffen werden soll. Die Speicherschnittstelle besitzt einen Autoinkrementierer,&lt;br /&gt;
mit dem fortlaufende Bytes einfach hintereinander geschrieben werden können, ohne dass jedes mal wieder der FPGA, das Gerät und die neue Adresse neu geschrieben werden müssen, was den Zugriff erheblich beschleunigt.&lt;br /&gt;
&lt;br /&gt;
Ursprünglich basierte das System auf einem SPI-Interface. Dabei wurde die Chip-Select-Leitung als &amp;quot;globaler&amp;quot; Interface-Reset betrachtet, d.h. war die Leitung auf High, war der FPGA deselektiert und und alle Interface-Zustandsautomaten wurden im Reset gehalten. Erst mit dem Setzen dieser Leitung wurde der FPGA angesprochen. (erstes Byte -&amp;gt; Daten-Dispatcher, folgende Bytes gehen an das ausgewählte Gerät). Weiterhin hat SPI die Eigenschaft, dass mit jedem gesendeten Byte auch eines empfangen wurde. Der Umstand, dass RS232 weder eine Chip-Select Leitung benötigt noch eine synchrone Übertragung erzwingt, führt zu dem Umstand, dass man bei Nutzung von RS232 einige Befehle zusätzlich benötigt. Diese Befehle werden durch das Zeichen 0x1b (ESC) eingeleitet. Soll statt der &amp;quot;Spezialfunktion&amp;quot; das Byte 0x1b übertragen werden, so wird dieses einfach erneut gesendet. Soll die Chip-Select-Leitung gesetzt bzw. gelöscht werden, so wird die Sequenz 0x1b 0x00 (Selektieren) bzw.&lt;br /&gt;
0x1b 0x01 (Deselektieren) gesendet. Soll ein zuvor im Ausgangsregister gesetztes Byte gesendet werden, so muss die Sequenz 0x1b 0x02 gesendet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
0x121b auf dem 7-Segment-Display per RS232 anzeigen:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x00      (Hi-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x12      (Wert 12)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x01      (Lo-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x1b 0x1b (Wert 1b -&amp;gt; zu beachten: wenn der Wert 0x1b übertragen werden soll, muss dieser doppelt gesendet werden !!)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Beispiel, um in den Programmspeicher des Audioprozessors an Adresse 0x0010 das Langwort 0x12233445 zu schreiben:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf1      (DAP selektieren)&lt;br /&gt;
*- 0x00      (Speicher schreiben)&lt;br /&gt;
*- 0x00      &lt;br /&gt;
*- 0x10      (Adresse 0x0010 -&amp;gt; PMEM-Adresse 0x010)&lt;br /&gt;
*- 0x12	    (Adresse 0x0010 -&amp;gt; 0x12)	&lt;br /&gt;
*- 0x23	    (Adresse 0x0011 -&amp;gt; 0x23, autoincrement)&lt;br /&gt;
*- 0x34      (Adresse 0x0012 -&amp;gt; 0x34, autoincrement)&lt;br /&gt;
*- 0x45      (Adresse 0x0013 -&amp;gt; 0x45, autoincrement)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Auslesen der 8 Schalter:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x04      (Schalter auslesen)&lt;br /&gt;
*- 0x00	    (dummy byte -&amp;gt; überträgt Schalterstellung in Ausgaberegister)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man die 8 Schalterstellungen binärcodiert)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Der Datendispatcher (welcher mit dem ersten Byte nach dem Selektieren des FPGAs [0x1b 0x00] angesprochen wird) hat weiterhin einige nützliche Funktionen, die in ihrer Gesamtheit allerdings noch nicht ausführlich getestet wurden. Darunter sind Funktionen, mit denen Informationen über die an den Ports des Daten-Dispatchers angeschlossenen Geräte zu ermitteln. Diese Funktion kann dazu genutzt werden, um zu ermitten, welche Geräte im FPGA implementiert sind und an welchen Ports welche Geräte angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
Anzahl der Ports des Daten-Dispatchers liefern:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xed      (Anzahl Ports lesen)&lt;br /&gt;
*- 0x00      (dummy byte -&amp;gt; überträgt Inhalt des Ausgaberegisters)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man 0x22)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
===DAP-Modul-Schnipsel===&lt;br /&gt;
&lt;br /&gt;
Um mal &amp;quot;eben&amp;quot; mit dem DAP zu spielen, ein paar Schnipsel die sich recht leicht zu kompletten Funktionsblöcken zusammenschließen lassen.&lt;br /&gt;
Es werden hier nur die RS232-Sequenzen mit einer kurzen Erklärung aufgelistet.&lt;br /&gt;
&lt;br /&gt;
*Dual Mono Biquad&lt;br /&gt;
&lt;br /&gt;
*ESC 0x00 - FPGA selektieren&lt;br /&gt;
*0xF1     - DAP auswählen&lt;br /&gt;
*0x00 0x00 0x00 - Memory Write (Adresse 0x0000 -&amp;gt; Program Memory)&lt;br /&gt;
*0x10 0x00 0x00 0x08 - Biquad mit Kanal 1 (0) rechnen (AMEM = 0x00;CMEM = 0x08) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x10 0xf0 0x08 0x10 - Biquad mit vorherigem Ergebnis (0xf) rechnen (AMEM = 0x08; CMEM = 0x10) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x01 0x00 0x00 0x00 - Audioprogramm Ende (wichtig !!!)&lt;br /&gt;
*ESC 0x01 - DAP &amp;amp; FPGA deselektieren&lt;br /&gt;
&lt;br /&gt;
Erklärung :&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Opcodes 0x100008 deutet an, dass ein Biquad durchgerechnet werden soll. Das Eingangsregister 0 bedeutet, dass Kanal 1 des 1. Codecs verwendet wird. Das Ausgangsregister, welches nach Fertigstellung des Ergebnisses benutzt werden soll, ist 0 (-&amp;gt; Kanal 1 des 1. Codecs). Der Teil 0x00 0x08 bedeutet hierbei, dass die Biquad-Koeffizienten im CMEM ab Adresse 0x08 stehen. Die Audio-Zwischenwerte werden in den Audiospeicher AMEM ab Adresse 0x00 gelegt.&lt;br /&gt;
Der zweite Opcode (0x10f00810) rechnet ebenfalls ein Biquad durch. Nur dass hier statt Kanal 1 des Codecs das voher vom SDSP berechnete Ergebnis verwendet werden soll (Kanal 0xf, wenn man so will). Ausgangsregister ist auch hier wieder Kanal 1. Da dieser Biquad unabhängig vom ersten (d.h. mit anderen Parametern) gerechnet werden soll, sind hier logischerweise auch andere Adressen für AMEM (0x08) und CMEM (0x10) angegeben. Die CMEM-Adresse ist dabei etwas unkritischer, da es ja durchaus sein kann, dass ein Audiosignal zweimal mit den selben Biquad-Werten gerechnet werden soll, bzw. unterschiedliche Kanäle mit den selben Biquad-Werten, z.b. bei einem Stereo-Equalizer. Kritischer ist allerdings die Verwendung der AMEM-Adresse. Diese sollte für jede Operation (sofern AMEM denn verwendet wird) unterschiedlich sein, vor allem bei der Berechnung von Biquads. Dies hat den Grund, dass bei Operationen, die dieselben AMEM Adressen haben, die vorher berechneten Werte überschrieben werden. Dies ist bei Biquads gaanz böse (kann u.U. SEHR laut werden), und vom Ergebnis her nicht vorhersagbar.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
[[bild:Fpga_ext_board_schematic_no_uc.JPG|thumb|500px]]&lt;br /&gt;
&lt;br /&gt;
Wie Eingangs erwähnt, benötigt das System eine (bzw. zwei) Audio-Codecs. Im aktuellen Schaltplan wird auf einen Mikroprozessor verzichtet. Dieser diente im System primär zu Initialisierung der Codecs. Dieser Vorgang kann nun vom PC aus gesteuert werden, da in der neuen ISE-6.2-Version 4 Leitungen herausgeführt wurden, welche per RS232 gesetzt und gelöscht werden. &lt;br /&gt;
Wer das System nachbauen möchte, kann entweder die TLV320AIC23B-Codecs oder auch beliebige andere Codecs verwenden, solange einer als Master und der andere als Slave arbeitet und beide auf den I2S-Modus mit 64FS und 20-Bit-Wortlänge eingestellt sind. Die Initialisierung dieser Codecs muss dann aber separat vorgenommen werden (wobei man dann wahrscheinlich nicht um einen uC drumrum kommt). Um das System zu testen (Programme und Koeffizienten in den DAP einzuspielen), wird lediglich eine serielle Schnittstelle verwendet. Wer will, kann aber genausogut den SPI-Modus verwenden und den DAP direkt von einem Mikrocontroller aus steuern. Zur Auswahl der verwendeten Schnittstelle (RS232 oder SPI) wird Pin 13 des B1-Connectors benutzt. Liegt dieser Pin auf GND, so wird der FPGA per RS232 gesteuert. Liegt dieser Pin auf 3.3V, so wird der FPGA per SPI gesteuert.&lt;br /&gt;
&lt;br /&gt;
Hier der Schaltplan meines verwendeten Audio-Boards.&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier noch die Pinbelegung des B1-Erweiterungssteckers:&lt;br /&gt;
&lt;br /&gt;
*01 GND&lt;br /&gt;
*02 VCC 5V&lt;br /&gt;
*03 VCC 3.3V&lt;br /&gt;
*04 N.C.&lt;br /&gt;
*05 SPI_CS - Chip Select (von uC nach FPGA)&lt;br /&gt;
*06 N.C.&lt;br /&gt;
*07 SPI_DI - SPI Data In (von uC nach FPGA)&lt;br /&gt;
*08 BCLK - Bit Clock (von Master Codec)&lt;br /&gt;
*09 SPI_CLK - SPI Clock (von uC nach FPGA)&lt;br /&gt;
*10 LRCLK - LR-Clock (von Master Codec)&lt;br /&gt;
*11 SPI_DO - SPI Data Out (von FPGA nach uC)&lt;br /&gt;
*12 SDOUT1 - zum D/A Wandler (Codec) 1&lt;br /&gt;
*13 IF_SEL - Interface Select (GND = RS232; VCC3.3 = SPI)&lt;br /&gt;
*14 SDIN1 - vom A/D Wandler (Codec) 1&lt;br /&gt;
*15 RXD_OUT - RS232 Signal vom MAX232 zum uC&lt;br /&gt;
*16 SDIN2 - vom A/D Wandler (Codec) 2&lt;br /&gt;
*17 TXD_IN - RS232 Signal vom uC zum MAX232&lt;br /&gt;
*18 SDOUT2 - zum D/A Wandler (Codec) 2&lt;br /&gt;
*19 GPO 3 - Chip-Select Codec 2&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 2 - Chip-Select Codec 1&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 1 - SPI-Data out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 0 - SPI-Clock Out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
&lt;br /&gt;
==Nexys Board==&lt;br /&gt;
&lt;br /&gt;
Im SVN Repository (s.u.) gibt es eine Version des DAPs für das Nexys Board.&lt;br /&gt;
Diese ist voll SW-Kompatibel zum alten Spartan 3 Board (allerdings z.Z. nur über RS232 steuerbar). Neu bei der Version ist das das Speicherinterface generisch ausgelegt wurde und ein einfacher SRAM-Controller für das Nexys Board PSDRAM geschrieben wurde. Durch das generische Interface ist es möglich andere Speicherarten anzubinden. Der verwendete Codec ist wie schon im bisherigen Projekt der TLV320AIC23B. Dieser wird via RS232 (6-pin Port A des Nexys Boards) über die GPO Leitungen (6-pin Port D des Nexys Boards) initialisiert. Die eigentlichen Datenleitungen des Codecs liegen an Port B (BCLK, LRCLK, DIN, DOUT).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download des DAP als MCS-File für das Nexys-1000 Board : [[Media:Nexys_dap.zip]]&lt;br /&gt;
&lt;br /&gt;
Diese Version ist voll lauffähig (wurde mit den Demos getestet).&lt;br /&gt;
Die Pin Belegung für die RS232 und den Audio-Codec ist wie folgt :&lt;br /&gt;
&lt;br /&gt;
Header A : RS232 Schnittstelle&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Pin 1 : RxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : TxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V/5V für MAX232/MAX3232)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header B : I2S Schnittstelle für 1 Codec&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : BitClk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : L/R Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : SDIN&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : SDOUT&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V für den Codec)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header D : Codec-Konfiguration via SPI&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : Codec 2 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : Codec 1 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : Codec SPI Data&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : Codec SPI Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DAP mit selbstgelötetem FPGA-Board==&lt;br /&gt;
&lt;br /&gt;
Auf einen Beitrag von Thomas Pototschnig hin bin ich auf sein selbstentworfenes Spartan-3-FPGA-Board (Grafikkarte) aufmerksam geworden. Thomas hat mir die Erlaubnis gegeben dieses Board für den DAP verwenden zu können und die Schaltpläne hier zu veröffentlichen. Nachdem ich von ihm noch einige Vorversionen (nur die Platinen) ergattern konnte und diese erfolgreich aufgebaut (mit Spartan 3-200 und -400) habe bin ich von diesem Board echt begeistert. Danke nochmals.&lt;br /&gt;
&lt;br /&gt;
[[Bild:FPGA-Board.jpg|thumb|300px|left]]&lt;br /&gt;
&lt;br /&gt;
Hier der Schaltplan und Layout. &lt;br /&gt;
&lt;br /&gt;
[[Media:miniFPGA-Board.zip]]&lt;br /&gt;
&lt;br /&gt;
Das Board ist 2-seitig und die &amp;quot;schlimmsten&amp;quot; zu lötenden Bauteile sind lediglich der FPGA (QFP-144) und die beiden RAMs (SOJ36, ekelig). Der Rest ist recht einfach. Auch die Inbetriebnahme des Boards gestaltete sich recht einfach.&lt;br /&gt;
&lt;br /&gt;
Den Quellcode für den DAP mußte ich etwas ändern und abspecken. Durch den ineffizienten VHDL-Code der MAC-Einheit gestaltete es sich schwierig das Design synthetisierbar zu machen. Das Synthetisieren auf einem FT256 gestaltete sich einfacher. Hier ist noch Handlungsbedarf in der Form das die MAC-Einheit überarbeitet werden muß. &lt;br /&gt;
Das abgespeckte Design läuft auf dem FPGA-Board mit einem Spartan 3-400 sowie auf einem Spartan 3-200. &lt;br /&gt;
Den Audio-Codec, das FPGA Board, einen AVR und noch etwas IO-Kram habe ich auf eine Lochraster aufgebaut. Was noch fehlt ist ein MIDI und ein SD/MMC-Karten Interface. Dann hat man eine schöne Plattform für Synthesizer und Effektgerät.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anmerkung==&lt;br /&gt;
&lt;br /&gt;
Da wie schon gesagt das Projekt komplett auf meinem &amp;quot;Mist&amp;quot; gewachsen ist wird es wohl noch eine Weile dauern bis alles was den DAP betrifft hier in diesem Artikel (und auch in einem Dokumentations-PDF) eingearbeitet ist. Ich werde (sofern ich Zeit dazu habe) noch ein Delphi Programm mit Source-Code einstellen, welche den DAP richtig nutzbar macht und man dann direkt damit &amp;quot;spielen&amp;quot; kann. Eine umfangreiche und vollständige Dokumentation würde momentan einfach zu viel Zeit in Anspruch nehmen und ich möchte langsam das Projekt Vorstellen um Anregung, Kritik und Verbesserungsvorschläge ernten zu können. Ich hoffe noch Leute zu finden um diesem Projekt noch mehr Leben und Möglichkeiten einhauchen zu können.&lt;br /&gt;
&lt;br /&gt;
==Fotos==&lt;br /&gt;
&lt;br /&gt;
Ursprüngliche Version:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Gesamt_wo_uc.jpg|thumb|200px|left|Spartan3 Board und Expansion Board]]&lt;br /&gt;
[[Bild:Codecs.jpg|thumb|200px|left|Expansion Board]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nexys-Board:&lt;br /&gt;
[[Bild:dap_nexys_v1.jpg|thumb|200px|left|Nexys Board mit 1 Audio-Codec]]&lt;br /&gt;
[[Bild:Nexys-board-gesamt.jpg|thumb|200px|left|Nexys Board mit Lochraster-Board und 2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
[[Bild:Nexys-board-codecs-1.jpg|thumb|200px|left|2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufbau von [[Benutzer:Andreas]]:&lt;br /&gt;
[[Bild:Nexys-Audio-DSP-Foto-Andreas.jpg|thumb|600px|left|Nexys + Breadboard + 1 [[Audio Codec Board]]]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Synth-gesamt-klein.jpg|thumb|500px|left|Aufbau des DAPs mit FPGA-Board (entworfen von Thomas Pototschnig) auf Lochraster an AVR, Codec und weiterer IO]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap-Synth-01.jpg|thumb|300px|left|Synth Board. DAP mit AVR,Codec, MIDI Interface, RS232 (schaltbar) und LCD]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_Ansicht_02.jpg|thumb|300px|left|Synth Board. Komplettansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_klein_3.jpg|thumb|600px|left|Synth Board. Synth-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Oben.jpg|thumb|300px|left|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Unten.jpg|thumb|300px|right|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Träger-und-Mainboard.jpg|thumb|600px|left|Selbstgeroutetes DAP-Board auf Trägerplatine]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Seite.jpg|thumb|300px|left|DAP-Board mit Touch-Display Seitenansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display.jpg|thumb|600px|left|DAP-Board mit Touch-Display]]&lt;br /&gt;
&lt;br /&gt;
Diese Version des DAP hat ein Grafikdisplay incl. Touchpanel. Die Ansteuerung übernimmt der FPGA. Dort ist einer kleiner &amp;quot;Grafik-Prozessor&amp;quot; integriert der das Update des Displays und das Kopieren der Bitmaps übernimmt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synthesizer Ansicht 1.jpg|thumb|600px|left|]]&lt;br /&gt;
Synth-Board. Komplettansicht in einem Cherry-Tastaturgehäuse (wie dafür gemacht :-)) im Synthesizer-Stil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synth Komplett.jpg|thumb|600px|left|Fertige Version des DAP als Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
Der komplette Synthesizer mit schicker Frontplatte und passendem (oben schon erwähnten :-)) Cherry-Tastatur-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Version 1.5.jpg|thumb|600px|left|Heue Hardware Version der DAP Hauptplatine]]&lt;br /&gt;
&lt;br /&gt;
Diese Version beinhaltet folgendes : :-) &lt;br /&gt;
&lt;br /&gt;
 - Xilinx XC3S400&lt;br /&gt;
 - ATmega2561&lt;br /&gt;
&lt;br /&gt;
 - 16 MByte (8Mx16) SDRAM&lt;br /&gt;
 - µSD Card Slot&lt;br /&gt;
 - AT45DB321 DataFlash&lt;br /&gt;
 - 24C512 EEProm&lt;br /&gt;
&lt;br /&gt;
 - TLC320AI23B Audio Codec mit Kopfhörer Ausgang&lt;br /&gt;
 - CS5343 A/D Wandler&lt;br /&gt;
 - CS4344 D/A Wandler&lt;br /&gt;
&lt;br /&gt;
 - MIDI&lt;br /&gt;
 - RS232&lt;br /&gt;
 - etlichen IO-Pins vom AVR und FPGA&lt;br /&gt;
 - 2 separaten Clock-Oszillatoren (nicht bestückt)&lt;br /&gt;
&lt;br /&gt;
... und weiterem Kleinkram (LevelShifter, LDO, Platformflash, usw ... und vielen 100nFern)&lt;br /&gt;
&lt;br /&gt;
Ideal zum Aufbau einer Audio-Platform. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audio Demos==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein EQ-Demo mit Rosa Rauschen. Klingt wie eine Meeresbrandung.&lt;br /&gt;
&lt;br /&gt;
[[Media:eq_demo1.zip]]&lt;br /&gt;
&lt;br /&gt;
Der DAP als Synth. Der DAP wird komplett vom PC aus gesteuert (Hüllkurve, Sequencer und Filterberechnung werden im PC gemacht).&lt;br /&gt;
&lt;br /&gt;
[[Media:synthdemo1.wav.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MC505 Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen von meiner Roland-MC505 Groovebox. Es wird einfach nur ein Werkspreset abgespielt und durch den DAP gejagt.&lt;br /&gt;
&lt;br /&gt;
* [[Media:mc505-eq-demo.wav.zip|EQ-Demo]]&lt;br /&gt;
* [[Media:mc505-filter-demo.wav.zip|Filter-Demo (Tiefpass/Hochpass/Notch)]]&lt;br /&gt;
* [[Media:mc505-delay-demo.wav.zip|Delay-Demo (137BPM [657ms &amp;amp; 876 ms]/Chorus)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Synth Board Audio Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen vom DAP in Verbindung mit einem AVR der die Filterkoeffizientenberechnung sowie eine komplette Synthesizer-Steuerung beinhaltet, also qausi einen Synthesizer aus dem DAP macht (inkl. MIDI-Steuerung).&lt;br /&gt;
&lt;br /&gt;
MIDI-Sequenz und Tiefpass-Filter (Filter und Modulation über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-01.mp3]]&lt;br /&gt;
&lt;br /&gt;
Diesselbe MIDI-Sequenz mit Hochpass-Filter (Filter und Modulation ebenfalls über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-02.mp3]]&lt;br /&gt;
&lt;br /&gt;
Ein eher Techno-ähnliches Demo, welches die Auflösung des Systems (DAP+AVR+MIDI) ein wenig zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap_syn_demo_03.mp3]]&lt;br /&gt;
&lt;br /&gt;
==Delphi Tools==&lt;br /&gt;
&lt;br /&gt;
Um den DAP nutzbar zu machen benötigt man entweder ein uC Programm oder ein PC Programm. Da das verwenden von PC-Programmen einfacher fürs Spielen und Experimentieren ist, werde ich hier im Laufe der Zeit kleine Demo-Programme aber auch komplette Front-Ends für den DAP reinstellen. Die Delphi-Programme sind allesamt in Turbo-Delphi geschrieben und die dazugehörigen Quellcodes werden ebenfalls im Laufe der Zeit geuploaded. Ich werde allerdings zuerst noch das Feature des Konfigurierens der Codecs vom PC aus einbauen. &lt;br /&gt;
Nachtrag zum Konfigurieren des Codecs : Prinzipiell funktioniert es, allerdings ist das mit häßlichen Nebengeräuschen verbunden, da ich bei jeder Änderung der Lautstärke im Codec, diesen auch Resetten muß, da sonst immer beide Codecs beschrieben werden, was unschön ist. Warum dies so ist kann ich leider nicht sagen, da ich keine Möglichkeit habe die SPI-Leitungen mitzusniffen (bräuchte dafür einen kleinen LA, den ich nicht habe). &lt;br /&gt;
&lt;br /&gt;
* Demo eines 3 Band Stereo Equalizers. (Der Knopf &amp;quot;MoveIt!&amp;quot; bringt Leben ins Demo): [[Media:dap_eq_demo.zip]]&lt;br /&gt;
* Demo eines 4 Kanal Mono Mixers mit Monitor (Vorhör)-Ausgang: [[Media:dap_mix_demo.zip]]&lt;br /&gt;
* Demo eines Synthesizer-Filters: [[Media:dap_filter_demo.zip]]&lt;br /&gt;
* Demo eines 2 Kanal Delays (Der Button &amp;quot;MoveIt!&amp;quot; macht daraus einen Chorus :-))): [[Media:dap_delay_demo.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Quellcodes für das EQ-Demo, das Filter-Demo und das Delay-Demo : [[Media:dap_demos_plus_delphi_source.zip]]&lt;br /&gt;
&lt;br /&gt;
Es folgen noch der Quellcode für den Mischer (hab ich gerade nicht zur Hand) und weitere Demos (ein Synthesizer und eine 4x4 Patchbay mit EQ und was mir sonst noch einfällt. Dann natürlich mit Source-Codes).&lt;br /&gt;
Anhand dieser Beispiele wird auch eine grobe Doku erstellt.&lt;br /&gt;
&lt;br /&gt;
== SVN-Repository ==&lt;br /&gt;
&lt;br /&gt;
 svn co svn://mikrocontroller.net/audiodsp&lt;br /&gt;
&lt;br /&gt;
Ein automatisch aktualisiertes Paket mit den Daten aus dem Repository gibt es unter http://www.mikrocontroller.net/download/audiodsp-snapshot.tar.gz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
&lt;br /&gt;
* 12.07.2007: Es wurde ein generisches Speicherinterfaces welches Wartezyklen im DAP erlaubt implementiert. Dadurch kann man auf die jeweilgen Speicher des Boards eingehen. Z.Z. ist nur ein einfaches Speicherinterface für den asynchronen Betrieb des PSDRAM des Nexys Boards implementiert. Das Interface ermögicht es einen RAM Controller anzuschließen welcher z.&amp;amp;nbsp;B. ein quasi-Multiport RAM darstellt. Getestet wurde der Stand mit dem Nexys-1000 Board.&lt;br /&gt;
&lt;br /&gt;
==To do==&lt;br /&gt;
&lt;br /&gt;
* nähere Zukunft&lt;br /&gt;
** Einen Konfigurationsdialog in die Demo-Programme einarbeiten mit denen man mit den Codecs etwas spielen kann (Line-In Level, Mikrofon-Level, Bypass, Head-Phone Volume) tlw. erledigt. Funktioniert aber nicht richtig, und daher noch nicht eingebaut. Quellcodes dazu sind vorhanden.&lt;br /&gt;
** Doku anhand der Demo-Programme erstellen&lt;br /&gt;
** C-Code schnipsel erstellen&lt;br /&gt;
&lt;br /&gt;
* fernere Zukunft&lt;br /&gt;
** Front-End des DAPs machen, mit dem sich DAP-Programme erstellen lassen, der Koeffizienten-, Daten- und Wellenform-Speicher beschrieben und gelesen werden kann, der Mikro-Code editierbar gemacht wird und noch ein paar Sachen mehr machbar sind&lt;br /&gt;
** weitere Module für den Rahmen (HDD-Core, weitere Routing-Möglichkeiten innerhalb der bisherigen Cores SDSP und Util)&lt;br /&gt;
&lt;br /&gt;
==Diskussion==&lt;br /&gt;
* http://www.mikrocontroller.net/topic/65205&lt;br /&gt;
* http://www.mikrocontroller.net/topic/34376&lt;br /&gt;
&lt;br /&gt;
Falls Interesse an einer Sammelbestellung für die Platinen und Bauteile besteht &lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/144288&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]] &lt;br /&gt;
[[Kategorie:Audio]]&lt;br /&gt;
[[Kategorie:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66878</id>
		<title>Audio-DSP mit Spartan 3-FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66878"/>
		<updated>2012-06-14T21:49:08Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* Audio-Prozessor (DAP) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [[Benutzer:TheMason]]&lt;br /&gt;
&lt;br /&gt;
==Ziel==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projekts ist es, eine FPGA-basierte Plattform aufzubauen mit der es möglich ist Synthesizer, Effektgeräte, Mischpulte  oder gar ein Harddiskrecording-System zu realisieren.&lt;br /&gt;
&lt;br /&gt;
==Feature-Liste==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften des Audio-Prozessors: &lt;br /&gt;
&lt;br /&gt;
* Oszillatoren&lt;br /&gt;
* Biquads (Filter)&lt;br /&gt;
* Addierer, Schalter, Verstärker (Multiplizierer)&lt;br /&gt;
* Delays&lt;br /&gt;
* Steuerung des Audio-Prozessors via SPI oder RS232&lt;br /&gt;
* 4 Mono Ein- und Ausgänge&lt;br /&gt;
* GPO (General Purpose Outputs) zur Konfiguration der Codecs&lt;br /&gt;
&lt;br /&gt;
==Übersicht==&lt;br /&gt;
[[Bild:Overview_wo_uc.jpg|thumb|500px]]&lt;br /&gt;
Basis des Audio-Systems ist das Xilinx Spartan 3-Development Board. An diesem Board werden 2 Audio-Codecs angschlossen von denen einer als Master und der andere als Slave agiert. Optional kann noch ein Mikrocontroller angeschlossen werden welcher den FPGA per SPI steuert. Da dieses Projekt mittlerweile recht umfangreich geworden ist, kann ich hier nur einen kurzen Umriss des Systems geben. Dabei beschränke ich mich auf die grobe Funktionsweise des Audio-Prozessors, erläutere das Interface (welches ich als Basis für weitere Projekte bereits nutze) und gebe einen kleinen Überblick über die Hardware.&lt;br /&gt;
&lt;br /&gt;
Das System kann (sofern man 2 Audio-Codecs, von denen einer als Master, der andere als Slave arbeitet, angeschlossen und konfiguriert hat) direkt genutzt werden, da der DAP per RS232 gesteuert werden kann. Der Audio-Prozessor startet mit einem Stereo-Tiefpass-Filter der sich auf den ersten Codec bezieht,&lt;br /&gt;
sodass man ein erstes Demo hat (selbst wenn es etwas unspektakulär ist)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nachbau==&lt;br /&gt;
&lt;br /&gt;
Wer sich dieses System nachbauen möchte, benötigt zunächst ein FPGA-Board. Mit dem Spartan-3-Board von Digilent gestaltet sich der Nachbau einfach, weil die Programmier-Dateien für den FPGA direkt für dieses Board verwendet werden können. Nutzer anderer Boards (Xilinx) müssten zuerst die UCF-Datei für die Pins ihres jeweiligen Boards anpassen, und dieses Projekt neu synthetisieren (compilieren). Nutzer von Altera-Boards hingegen müssen die BlockRAM-Instanzen auf die Altera-Architektur anpassen (den Inhalt der RAMs dabei nicht vergessen :-). Vielleicht findet sich ja der eine oder andere der den VHDL Code für Altera-FPGAs portiert.&lt;br /&gt;
Der eigentliche wichtige Teil eines Nachbaus ist der Codec-Teil. Dieses System verwendet zwar zwei Codecs, aber es kann auch mit einem gearbeitet werden. Als Codec kommt der TLV320AIC23B von Texas Instruments zum Einsatz. Diesen kann man als kostenloses Muster bei TI direkt bekommen. &lt;br /&gt;
Des weiteren benötigt man noch eine handvoll Bauteile wie Kondensatoren, Widerstände und einen Quarz. (Ein Codec MUSS als Master laufen, sonst hat das System keine Audio-Clocks, da diese nicht vom FPGA generiert werden)&lt;br /&gt;
Die Initialisierung des Codecs wird vom PC aus gemacht. Dazu dienen die 4 GPO-Leitungen auf dem B1-Verbinder. Da der Codec nur &amp;quot;halbes&amp;quot; SPI unterstüzt (man kann nur schreiben, nicht lesen) gestaltet sich die Initialisierung recht einfach.&lt;br /&gt;
Die 4 GPO-Leitungen teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* Chip-Select Codec 2&lt;br /&gt;
* Chip-Select Codec 1&lt;br /&gt;
* SPI Data Out&lt;br /&gt;
* SPI Clock&lt;br /&gt;
&lt;br /&gt;
==Audio-Prozessor (DAP)==&lt;br /&gt;
&lt;br /&gt;
[[bild:Overview dap core.JPG|thumb|500px|right]]&lt;br /&gt;
&lt;br /&gt;
Der FPGA beinhaltet in dem gesamten System einen Quasi-DSP. Quasi-DSP deshalb, da die Struktur im Gegensatz zu einem DSP bzw. Mikrocontroller keine Verzweigungen, Interrupts oder ähnliches zulässt. Der Audio-Prozessor besteht im wesentlichen aus 3 Teilen : einem Rahmen, einem SDSP (Small DSP)-Kern &lt;br /&gt;
sowie einem Utility-Kern. Beide Kerne können theoretisch parallel arbeiten, da jeder Kern einen eigenen Zustandsautomaten und einen eigenen Microcode-Speicher besitzen. Diese Möglichkeit ist allerdings noch nicht implementiert.&lt;br /&gt;
&lt;br /&gt;
Der SDSP-Kern besteht im wesentlichen aus einer MAC-Einheit, einem Speicher für Audiodaten, einem Koeffizienten-Speicher, einem Adressgenerator und mehreren Muxern, sowie dem schon angesprochenen Zustandsautomaten und dem Microcode. Weiterhin ist ein Hidden-Write- (bzw. Shadow Register) Mechanismus integriert,&lt;br /&gt;
welcher ein &amp;quot;knackserfreies&amp;quot; Aktualisieren von Koeffizienten ermöglicht. Alle diese Komponenten werden vom Microcode aus gesteuert (genau wie bei einem Mikrocontroller). Mit diesem Kern ist es möglich, Audiosignale zu bearbeiten. Zu Den Bearbeitungsmöglichkeiten zählen in erster Linie das Verändern der Lautstärke, Mischen, Filtern (Biquad) sowie Laden und Speichern von &lt;br /&gt;
Audiowerten.&lt;br /&gt;
&lt;br /&gt;
Der Utility-Kern besteht aus einem Akkumulator (für DDS), einem Shaper, einem Adressgenerator, einem Wavetable-Speicher, einem Zufallszahlengenerator, einigen Muxern, (einem Adressgenerator für SRAM, einem SRAM-Controller; diese sind allerdings nur nutzbar, wenn man das ganze mit dem ISE 6.2 synthetisiert) &lt;br /&gt;
und dem schon angesprochenen Zustandsautomaten und dem Microcode. Der Microcode steuert (genau wie beim SDSP-Kern) dabei die einzelnen Komponenten des Utility-Kerns. Dieser Kern ist für das Erzeugen von Audiosignalen zuständig, und erlaubt ein Audiosignal zu verzögern, sofern man die ISE-Version 6.2 verwendet (später dazu mehr). Als Wellenformen stehen Sägezahn, Rechteck (mit veränderbarer Pulsbreite), Rauschen sowie benutzderdefinierbare Wellenformen (Wavetable) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Der Rahmen besteht aus einem Zustandsautomaten, einem Programmspeicher, einigen Muxern, sowie einem doppelten I2S-Sender/Empfänger (für 2 Stereo Ein- und Ausgänge). In den Rahmen werden die beiden Kerne &amp;quot;eingehängt&amp;quot;. Die Kerne werden vom Programmspeicher aus mit Daten versorgt, und vom Zustandsautomaten angesteuert. Der Programmspeicher (PMEM) ist als 512x32 Bit organisiert. Das heißt, dass ein Befehl im Programmspeicher 32 Bit an Informationen enthält und der Audioprozessor max. 512 Befehle umfassen kann.&lt;br /&gt;
&lt;br /&gt;
===SDSP-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:SDSP-Struct.jpg|thumb|300px|left|Struktur des SDSP-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Der eigentliche Kern des DAPs ist die MAC-Einheit. Mit ihr werden die grundlegenden Operationen Multiplikation und Addition durchgeführt. Es ist eine 32x32-Bit-Einheit. &lt;br /&gt;
Die Funktionsweise des Kerns ist eigentlich recht einfach. &lt;br /&gt;
Die MAC-Einheit hat 2 Eingänge. Einer dieser Eingänge kann ein Audiosignal, ein Wert aus dem Audiospeicher (AMEM-BlockRAM) oder ein zuvor berechnetes Ergebnis sein. Der andere Eingang kann ein Koeffizient aus dem CMEM-BlockRAM oder eine Konstante (1.000, 0.000 oder -1.000) sein.&lt;br /&gt;
Der Ausgang (32-Bit, hart geclippt) geht auf das AMEM-BlockRAM und zum Ausgangs-Clipping. Das Ausgangsclipping schneidet das Audiosignal auf 24-Bit zurecht.&lt;br /&gt;
Die Adressen für die Speicher (AMEM und CMEM) werden im Addressgenerator erzeugt. Dieser wird von außen mit einer 8-Bit-Basis-Adresse gespeist und erzeugt einen Offset zu den Eingangsadressen. Er besitzt 2 setzbare Zähler und einige Multiplexer.&lt;br /&gt;
Alle Steuersignale der Komponenten von einem weiteren aus BlockRAM (MMEM) versorgt. Weiterhin wird von außen eine Startadresse vorgegeben. Dadurch lassen sich quasi Opcodes mit von außen vorgegeben Parametern (Adressen) aufrufen.&lt;br /&gt;
Das MMEM-BlockRAM wird nun einfach nur linear ausgelesen bis ein Stopbit gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Util-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Util-Core.jpg|thumb|300px|left|Struktur des Utility-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Beschreibung folgt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opcodes des DAP===&lt;br /&gt;
&lt;br /&gt;
Diese 32 Bit eines Befehls teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* 4 Bit = Opcode (für SDSP und Utility Kern gleich)&lt;br /&gt;
* 2 Bit = noch leer&lt;br /&gt;
* 1 Bit = Core Select (SDSP oder Utility)&lt;br /&gt;
* 1 Bit = Ende des Programms&lt;br /&gt;
* 4 Bit = Eingangsrouting (Kanal 1 - 4, Ergebnis SDSP-Kern, Ergebnis Utility-Kern)&lt;br /&gt;
* 4 Bit = Ausgangsrouting (SDSP-Ausgang auf Kanal 1-4, Utility-Ausgang auf Kanal 1-4)&lt;br /&gt;
* 8 Bit = Adresse 1 (bei SDSP für Audio-Memory, bei Utility-Kern für Datenspeicher)&lt;br /&gt;
* 8 Bit = Adresse 2 (bei SDSP für Koeffizientenspeicher, bei Utility-Kern unbenutzt)&lt;br /&gt;
&lt;br /&gt;
Das Eingangsrouting bestimmt, mit welchem Signal der gewählte Kern arbeiten soll. Dies können die Eingänge 1-4 aber auch ein vorher berechnetes Ergebnis des SDSP- bzw. Utility-Kerns sein. Das Ausgangsrouting bestimmt, von welchem Kern das Signal auf welchen Ausgang geroutet wird.&lt;br /&gt;
&lt;br /&gt;
Die Opcodes des DAPs sind:&lt;br /&gt;
&lt;br /&gt;
SDSP-Kern:&lt;br /&gt;
* Biquad rechnen&lt;br /&gt;
* Audiowert speichern&lt;br /&gt;
* Audiowert laden&lt;br /&gt;
* Move eines Wertes im Audiospeicher&lt;br /&gt;
* Summe rücksetzen&lt;br /&gt;
* Eingang zu Summe addieren&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe addieren&lt;br /&gt;
* Eingang zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Wert aus dem Audiospeicher zu Summe mischen (mit Lautstärkekoeffizient)&lt;br /&gt;
* Lautstärke &lt;br /&gt;
&lt;br /&gt;
Utility-Kern:&lt;br /&gt;
* Oszillator (DDS-Teil)&lt;br /&gt;
* Waveshaper&lt;br /&gt;
* Verzögerung&lt;br /&gt;
&lt;br /&gt;
Der Ablauf eines Audio-Programms ist folgender:&lt;br /&gt;
&lt;br /&gt;
Sobald ein neues Sample anliegt, wird die Abarbeitung des Programms von Adresse 0x0000 an im PMEM angestoßen. Es wird dabei jeweils ein Befehl geladen und Daten wie Opcode und Adressen liegen dabei an beide Kernen gleichermaßen an. Ist das Programm-Ende-Bit nicht gesetzt, so wird der jeweilige Kern (mit dem im Opcode angegeben Routing) angesteuert. Legt der betreffende Kern sein Ready-Signal auf 1, so wird der nächste Befehl abgearbeitet. Dieses Verhalten (Laden und Verteilen von Opcode-Daten sowie die Ablaufsteuerung, also das Ansteuern des Programms, Ansteuern der einzelnen Kerne, warten auf dessen Abarbeitung und das Programmende) wird vom Rahmen übernommen.&lt;br /&gt;
&lt;br /&gt;
===Speicherorganisation===&lt;br /&gt;
&lt;br /&gt;
Alle Speicher die vom DAP angesprochen werden, haben eine Wortbreite von 32 Bit, der Zugriff erfolgt aber ausschließlich über eine Breite von 8 Bit (Interface).&lt;br /&gt;
&lt;br /&gt;
DAP&lt;br /&gt;
* Programmspeicher 	(PMEM)   0x0000 - 0x07ff&lt;br /&gt;
&lt;br /&gt;
SDSP&lt;br /&gt;
* Audiospeicher   	(AMEM)   von außen nicht zugänglich&lt;br /&gt;
* Koeffizientenspeicher 	(CMEM)   0x2000 - 0x2023  (man &amp;quot;sieht&amp;quot; nur den Hidden Write -&amp;gt; später mehr dazu)&lt;br /&gt;
* Microcodespeicher      (MMEM)   0x4000 - 0x47ff&lt;br /&gt;
&lt;br /&gt;
Utility-Core&lt;br /&gt;
* Datenspeicher          (DMEM)   0x6000 - 0x67ff&lt;br /&gt;
* Wavetable-Speicher      (WMEM)   0x8000 - 0x87ff&lt;br /&gt;
* Microcodespeicher      (UMEM)   0xa000 - 0xa7ff&lt;br /&gt;
&lt;br /&gt;
===Hidden-Write===&lt;br /&gt;
Um bei Änderung der Koeffizienten Knackser zu vermeiden (die dadurch entstehen das der Koeffizient nur teilweise [durch 8-Bit-Zugriffe] geändert wird, währenddessen aber Audio trotzdem noch &amp;quot;weiterläuft&amp;quot; und mit &amp;quot;falschen&amp;quot; Zwischenwerten gerechnet wird), ist ein Mechanismus implementiert, der die zu ändernden Koeffizienten im Hintergund in den Speicher schreibt. Um diesen Mechanismus zu nutzen, müssen zuerst die Koeffizienten in interne Register&lt;br /&gt;
geschrieben werden. Die Register (es sind 8 32-Bit-Register) liegen im Speicherbereich 0x2000 bis 0x201f. Die Speicherstelle 0x2020 gibt die Startadresse innerhalb des Koeffizientenspeichers an. Diese Adresse ist nur 8 Bit breit. Die Speicherstelle 0x2021 gibt an, wieviele der 8 Register übertragen werden sollen. Die Speicherstelle 0x2022 löst den Kopiervorgang aus. Hier reicht es, ein Dummy-Byte zu schreiben. Um den Kopiervorgang zu beenden (MUSS GEMACHT WERDEN!, sonst können keine weiteren Koeffizientenupdates gemacht werden), schreibt man an Speicherstelle 0x2023 ebenfalls ein Dummy-Byte.&lt;br /&gt;
&lt;br /&gt;
===I/O Register===&lt;br /&gt;
&lt;br /&gt;
Es gibt noch einen 8-Bit breiten Adressbereich innerhalb des DAPs, mit dem der I2S-Teil stummgeschaltet werden kann. Weiterhin hat man die Möglichkeit, die Anzahl der Systemtakte pro Sample und die Anzahl der aktiven Systemtakte (also die Zeit die der Audioprozessor beschäftigt ist) zu ermitteln. Dadurch lässt sich eine Auslastungsanzeige des DAPs realisieren.&lt;br /&gt;
&lt;br /&gt;
===Interface===&lt;br /&gt;
&lt;br /&gt;
Um von außen nun ein Programm (bzw. Koeffizienten und Daten) zu laden, ist eine einfach zu handhabende und erweiterbare Schnittstelle implementiert. Die Schnittstelle kann per RS232 (fest eingestellt auf 115,2kBaud) oder per SPI (wird hardwaremäßig eingestellt) angesteuert werden. Die Schnittstelle in ihrer Gesamtheit ist schichtweise aufgebaut und beginnt mit einem Daten-Dispatcher. Dieser Daten-Dispatcher entscheidet (nachdem dieser selektiert wurde) mit dem ersten Byte, an welches angeschlossene Gerät der weitere Datenstrom geleitet wird.&lt;br /&gt;
&lt;br /&gt;
Als angeschlossene Geräte sind im aktuellen Entwurf ein Gerät namens &amp;quot;StdIO&amp;quot; und der Audioprozessor verfügbar.&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;StdIO&amp;quot;-Gerät steuert die 7-Segment-Anzeige (16-Bit-Hexadezimalanzeige oder 32-Bit-Einzelsegmentanzeige) sowie die 8 Leuchtdioden, und erlaubt es, die 3 Drucktaster sowie die 8 Schiebeschalter auszulesen.&lt;br /&gt;
&lt;br /&gt;
Der Audioprozessor besteht (schnittstellenseitig) nur aus einer Speicherzugriffsschnittstelle. Diese Schnittstelle entscheidet mit dem ersten Byte (sobald es selektiert wurde), ob in den Speicher geschrieben, von diesem gelesen, ein I/O-Schreib- oder -Lesezugriff erfolgen soll.&lt;br /&gt;
Die folgenden 2 Bytes (im Falle eines I/O-Zugriffs nur 1 Byte) bestimmen die Adresse und damit den Speicherbereich des Audioprozessors, auf den zugegriffen werden soll. Die Speicherschnittstelle besitzt einen Autoinkrementierer,&lt;br /&gt;
mit dem fortlaufende Bytes einfach hintereinander geschrieben werden können, ohne dass jedes mal wieder der FPGA, das Gerät und die neue Adresse neu geschrieben werden müssen, was den Zugriff erheblich beschleunigt.&lt;br /&gt;
&lt;br /&gt;
Ursprünglich basierte das System auf einem SPI-Interface. Dabei wurde die Chip-Select-Leitung als &amp;quot;globaler&amp;quot; Interface-Reset betrachtet, d.h. war die Leitung auf High, war der FPGA deselektiert und und alle Interface-Zustandsautomaten wurden im Reset gehalten. Erst mit dem Setzen dieser Leitung wurde der FPGA angesprochen. (erstes Byte -&amp;gt; Daten-Dispatcher, folgende Bytes gehen an das ausgewählte Gerät). Weiterhin hat SPI die Eigenschaft, dass mit jedem gesendeten Byte auch eines empfangen wurde. Der Umstand, dass RS232 weder eine Chip-Select Leitung benötigt noch eine synchrone Übertragung erzwingt, führt zu dem Umstand, dass man bei Nutzung von RS232 einige Befehle zusätzlich benötigt. Diese Befehle werden durch das Zeichen 0x1b (ESC) eingeleitet. Soll statt der &amp;quot;Spezialfunktion&amp;quot; das Byte 0x1b übertragen werden, so wird dieses einfach erneut gesendet. Soll die Chip-Select-Leitung gesetzt bzw. gelöscht werden, so wird die Sequenz 0x1b 0x00 (Selektieren) bzw.&lt;br /&gt;
0x1b 0x01 (Deselektieren) gesendet. Soll ein zuvor im Ausgangsregister gesetztes Byte gesendet werden, so muss die Sequenz 0x1b 0x02 gesendet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
0x121b auf dem 7-Segment-Display per RS232 anzeigen:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x00      (Hi-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x12      (Wert 12)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x01      (Lo-Byte der 7-Segment-Hex-Anzeige wählen)&lt;br /&gt;
*- 0x1b 0x1b (Wert 1b -&amp;gt; zu beachten: wenn der Wert 0x1b übertragen werden soll, muss dieser doppelt gesendet werden !!)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Beispiel, um in den Programmspeicher des Audioprozessors an Adresse 0x0010 das Langwort 0x12233445 zu schreiben:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf1      (DAP selektieren)&lt;br /&gt;
*- 0x00      (Speicher schreiben)&lt;br /&gt;
*- 0x00      &lt;br /&gt;
*- 0x10      (Adresse 0x0010 -&amp;gt; PMEM-Adresse 0x010)&lt;br /&gt;
*- 0x12	    (Adresse 0x0010 -&amp;gt; 0x12)	&lt;br /&gt;
*- 0x23	    (Adresse 0x0011 -&amp;gt; 0x23, autoincrement)&lt;br /&gt;
*- 0x34      (Adresse 0x0012 -&amp;gt; 0x34, autoincrement)&lt;br /&gt;
*- 0x45      (Adresse 0x0013 -&amp;gt; 0x45, autoincrement)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Auslesen der 8 Schalter:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xf0      (StdIO selektieren)&lt;br /&gt;
*- 0x04      (Schalter auslesen)&lt;br /&gt;
*- 0x00	    (dummy byte -&amp;gt; überträgt Schalterstellung in Ausgaberegister)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man die 8 Schalterstellungen binärcodiert)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
Der Datendispatcher (welcher mit dem ersten Byte nach dem Selektieren des FPGAs [0x1b 0x00] angesprochen wird) hat weiterhin einige nützliche Funktionen, die in ihrer Gesamtheit allerdings noch nicht ausführlich getestet wurden. Darunter sind Funktionen, mit denen Informationen über die an den Ports des Daten-Dispatchers angeschlossenen Geräte zu ermitteln. Diese Funktion kann dazu genutzt werden, um zu ermitten, welche Geräte im FPGA implementiert sind und an welchen Ports welche Geräte angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
Anzahl der Ports des Daten-Dispatchers liefern:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA selektieren)&lt;br /&gt;
*- 0xed      (Anzahl Ports lesen)&lt;br /&gt;
*- 0x00      (dummy byte -&amp;gt; überträgt Inhalt des Ausgaberegisters)&lt;br /&gt;
*- ESC 0x02  (Ausgaberegister übertragen, danach empfängt man 0x22)&lt;br /&gt;
*- ESC 0x01  (FPGA deselektieren)&lt;br /&gt;
&lt;br /&gt;
===DAP-Modul-Schnipsel===&lt;br /&gt;
&lt;br /&gt;
Um mal &amp;quot;eben&amp;quot; mit dem DAP zu spielen, ein paar Schnipsel die sich recht leicht zu kompletten Funktionsblöcken zusammenschließen lassen.&lt;br /&gt;
Es werden hier nur die RS232-Sequenzen mit einer kurzen Erklärung aufgelistet.&lt;br /&gt;
&lt;br /&gt;
*Dual Mono Biquad&lt;br /&gt;
&lt;br /&gt;
*ESC 0x00 - FPGA selektieren&lt;br /&gt;
*0xF1     - DAP auswählen&lt;br /&gt;
*0x00 0x00 0x00 - Memory Write (Adresse 0x0000 -&amp;gt; Program Memory)&lt;br /&gt;
*0x10 0x00 0x00 0x08 - Biquad mit Kanal 1 (0) rechnen (AMEM = 0x00;CMEM = 0x08) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x10 0xf0 0x08 0x10 - Biquad mit vorherigem Ergebnis (0xf) rechnen (AMEM = 0x08; CMEM = 0x10) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x01 0x00 0x00 0x00 - Audioprogramm Ende (wichtig !!!)&lt;br /&gt;
*ESC 0x01 - DAP &amp;amp; FPGA deselektieren&lt;br /&gt;
&lt;br /&gt;
Erklärung :&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Opcodes 0x100008 deutet an, dass ein Biquad durchgerechnet werden soll. Das Eingangsregister 0 bedeutet, dass Kanal 1 des 1. Codecs verwendet wird. Das Ausgangsregister, welches nach Fertigstellung des Ergebnisses benutzt werden soll, ist 0 (-&amp;gt; Kanal 1 des 1. Codecs). Der Teil 0x00 0x08 bedeutet hierbei, dass die Biquad-Koeffizienten im CMEM ab Adresse 0x08 stehen. Die Audio-Zwischenwerte werden in den Audiospeicher AMEM ab Adresse 0x00 gelegt.&lt;br /&gt;
Der zweite Opcode (0x10f00810) rechnet ebenfalls ein Biquad durch. Nur dass hier statt Kanal 1 des Codecs das voher vom SDSP berechnete Ergebnis verwendet werden soll (Kanal 0xf, wenn man so will). Ausgangsregister ist auch hier wieder Kanal 1. Da dieser Biquad unabhängig vom ersten (d.h. mit anderen Parametern) gerechnet werden soll, sind hier logischerweise auch andere Adressen für AMEM (0x08) und CMEM (0x10) angegeben. Die CMEM-Adresse ist dabei etwas unkritischer, da es ja durchaus sein kann, dass ein Audiosignal zweimal mit den selben Biquad-Werten gerechnet werden soll, bzw. unterschiedliche Kanäle mit den selben Biquad-Werten, z.b. bei einem Stereo-Equalizer. Kritischer ist allerdings die Verwendung der AMEM-Adresse. Diese sollte für jede Operation (sofern AMEM denn verwendet wird) unterschiedlich sein, vor allem bei der Berechnung von Biquads. Dies hat den Grund, dass bei Operationen, die dieselben AMEM Adressen haben, die vorher berechneten Werte überschrieben werden. Dies ist bei Biquads gaanz böse (kann u.U. SEHR laut werden), und vom Ergebnis her nicht vorhersagbar.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
[[bild:Fpga_ext_board_schematic_no_uc.JPG|thumb|500px]]&lt;br /&gt;
&lt;br /&gt;
Wie Eingangs erwähnt benötigt das System eine (bzw. zwei) Audio-Codecs. Im aktuellen Schaltplan wird auf einen Mikroprozessor verzichtet. Dieser diente im System erstmal nur zu Initialisierung der Codecs. Dieser Vorgang kann nun vom PC aus gesteuert werden, da in der neuen ISE 6.2 Version 4 Leitungen herausgeführt wurden, welche per RS232 gesetzt und gelöscht werden. &lt;br /&gt;
Wer das System nachbauen möchte kann entweder die TLV320AIC23B Codecs, aber auch beliebige andere Codecs verwenden, solange einer als Master und der andere als Slave arbeitet und beide auf den I2S Modus mit 64FS und 20 Bit Wortlänge eingestellt sind. Die Initialisierung dieser Codecs muß dann aber separat vorgenommen werden (wobei man dann wahrscheinlich nicht um einen uC drum herum kommt). Um das System zu Testen (Programme und Koeffizienten in den DAP einzuspielen) wird lediglich eine serielle Schnittstelle verwendet. Wer will kann aber genausogut den SPI-Modus verwenden und den DAP direkt von einem Mikrocontroller aus steuern. Zur Auswahl der verwendeten Schnittstelle (RS232 oder SPI) wird Pin 13 des B1-Connectors benutzt. Liegt dieser Pin auf GND so wird der FPGA per RS232 gesteuert. Liegt dieser Pin auf 3.3V so wird der FPGA per SPI gesteuert.&lt;br /&gt;
&lt;br /&gt;
Hier der Schaltplan meines verwendeten Audio-Boards.&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier noch die Pin-Belegung des B1-Expansion Connectors:&lt;br /&gt;
&lt;br /&gt;
*01 GND&lt;br /&gt;
*02 VCC 5V&lt;br /&gt;
*03 VCC 3.3V&lt;br /&gt;
*04 N.C.&lt;br /&gt;
*05 SPI_CS - Chip Select (von uC nach FPGA)&lt;br /&gt;
*06 N.C.&lt;br /&gt;
*07 SPI_DI - SPI Data In (von uC nach FPGA)&lt;br /&gt;
*08 BCLK - Bit Clock (von Master Codec)&lt;br /&gt;
*09 SPI_CLK - SPI Clock (von uC nach FPGA)&lt;br /&gt;
*10 LRCLK - LR-Clock (von Master Codec)&lt;br /&gt;
*11 SPI_DO - SPI Data Out (von FPGA nach uC)&lt;br /&gt;
*12 SDOUT1 - zum D/A Wandler (Codec) 1&lt;br /&gt;
*13 IF_SEL - Interface Select (GND = RS232; VCC3.3 = SPI)&lt;br /&gt;
*14 SDIN1 - vom A/D Wandler (Codec) 1&lt;br /&gt;
*15 RXD_OUT - RS232 Signal vom MAX232 zum uC&lt;br /&gt;
*16 SDIN2 - vom A/D Wandler (Codec) 2&lt;br /&gt;
*17 TXD_IN - RS232 Signal vom uC zum MAX232&lt;br /&gt;
*18 SDOUT2 - zum D/A Wandler (Codec) 2&lt;br /&gt;
*19 GPO 3 - Chip-Select Codec 2&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 2 - Chip-Select Codec 1&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 1 - SPI-Data out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 0 - SPI-Clock Out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
&lt;br /&gt;
==Nexys Board==&lt;br /&gt;
&lt;br /&gt;
Im SVN Repository (s.u.) gibt es eine Version des DAPs für das Nexys Board.&lt;br /&gt;
Diese ist voll SW-Kompatibel zum alten Spartan 3 Board (allerdings z.Z. nur über RS232 steuerbar). Neu bei der Version ist das das Speicherinterface generisch ausgelegt wurde und ein einfacher SRAM-Controller für das Nexys Board PSDRAM geschrieben wurde. Durch das generische Interface ist es möglich andere Speicherarten anzubinden. Der verwendete Codec ist wie schon im bisherigen Projekt der TLV320AIC23B. Dieser wird via RS232 (6-pin Port A des Nexys Boards) über die GPO Leitungen (6-pin Port D des Nexys Boards) initialisiert. Die eigentlichen Datenleitungen des Codecs liegen an Port B (BCLK, LRCLK, DIN, DOUT).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download des DAP als MCS-File für das Nexys-1000 Board : [[Media:Nexys_dap.zip]]&lt;br /&gt;
&lt;br /&gt;
Diese Version ist voll lauffähig (wurde mit den Demos getestet).&lt;br /&gt;
Die Pin Belegung für die RS232 und den Audio-Codec ist wie folgt :&lt;br /&gt;
&lt;br /&gt;
Header A : RS232 Schnittstelle&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Pin 1 : RxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : TxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V/5V für MAX232/MAX3232)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header B : I2S Schnittstelle für 1 Codec&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : BitClk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : L/R Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : SDIN&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : SDOUT&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V für den Codec)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header D : Codec-Konfiguration via SPI&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : Codec 2 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : Codec 1 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : Codec SPI Data&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : Codec SPI Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DAP mit selbstgelötetem FPGA-Board==&lt;br /&gt;
&lt;br /&gt;
Auf einen Beitrag von Thomas Pototschnig hin bin ich auf sein selbstentworfenes Spartan-3-FPGA-Board (Grafikkarte) aufmerksam geworden. Thomas hat mir die Erlaubnis gegeben dieses Board für den DAP verwenden zu können und die Schaltpläne hier zu veröffentlichen. Nachdem ich von ihm noch einige Vorversionen (nur die Platinen) ergattern konnte und diese erfolgreich aufgebaut (mit Spartan 3-200 und -400) habe bin ich von diesem Board echt begeistert. Danke nochmals.&lt;br /&gt;
&lt;br /&gt;
[[Bild:FPGA-Board.jpg|thumb|300px|left]]&lt;br /&gt;
&lt;br /&gt;
Hier der Schaltplan und Layout. &lt;br /&gt;
&lt;br /&gt;
[[Media:miniFPGA-Board.zip]]&lt;br /&gt;
&lt;br /&gt;
Das Board ist 2-seitig und die &amp;quot;schlimmsten&amp;quot; zu lötenden Bauteile sind lediglich der FPGA (QFP-144) und die beiden RAMs (SOJ36, ekelig). Der Rest ist recht einfach. Auch die Inbetriebnahme des Boards gestaltete sich recht einfach.&lt;br /&gt;
&lt;br /&gt;
Den Quellcode für den DAP mußte ich etwas ändern und abspecken. Durch den ineffizienten VHDL-Code der MAC-Einheit gestaltete es sich schwierig das Design synthetisierbar zu machen. Das Synthetisieren auf einem FT256 gestaltete sich einfacher. Hier ist noch Handlungsbedarf in der Form das die MAC-Einheit überarbeitet werden muß. &lt;br /&gt;
Das abgespeckte Design läuft auf dem FPGA-Board mit einem Spartan 3-400 sowie auf einem Spartan 3-200. &lt;br /&gt;
Den Audio-Codec, das FPGA Board, einen AVR und noch etwas IO-Kram habe ich auf eine Lochraster aufgebaut. Was noch fehlt ist ein MIDI und ein SD/MMC-Karten Interface. Dann hat man eine schöne Plattform für Synthesizer und Effektgerät.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anmerkung==&lt;br /&gt;
&lt;br /&gt;
Da wie schon gesagt das Projekt komplett auf meinem &amp;quot;Mist&amp;quot; gewachsen ist wird es wohl noch eine Weile dauern bis alles was den DAP betrifft hier in diesem Artikel (und auch in einem Dokumentations-PDF) eingearbeitet ist. Ich werde (sofern ich Zeit dazu habe) noch ein Delphi Programm mit Source-Code einstellen, welche den DAP richtig nutzbar macht und man dann direkt damit &amp;quot;spielen&amp;quot; kann. Eine umfangreiche und vollständige Dokumentation würde momentan einfach zu viel Zeit in Anspruch nehmen und ich möchte langsam das Projekt Vorstellen um Anregung, Kritik und Verbesserungsvorschläge ernten zu können. Ich hoffe noch Leute zu finden um diesem Projekt noch mehr Leben und Möglichkeiten einhauchen zu können.&lt;br /&gt;
&lt;br /&gt;
==Fotos==&lt;br /&gt;
&lt;br /&gt;
Ursprüngliche Version:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Gesamt_wo_uc.jpg|thumb|200px|left|Spartan3 Board und Expansion Board]]&lt;br /&gt;
[[Bild:Codecs.jpg|thumb|200px|left|Expansion Board]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nexys-Board:&lt;br /&gt;
[[Bild:dap_nexys_v1.jpg|thumb|200px|left|Nexys Board mit 1 Audio-Codec]]&lt;br /&gt;
[[Bild:Nexys-board-gesamt.jpg|thumb|200px|left|Nexys Board mit Lochraster-Board und 2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
[[Bild:Nexys-board-codecs-1.jpg|thumb|200px|left|2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufbau von [[Benutzer:Andreas]]:&lt;br /&gt;
[[Bild:Nexys-Audio-DSP-Foto-Andreas.jpg|thumb|600px|left|Nexys + Breadboard + 1 [[Audio Codec Board]]]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Synth-gesamt-klein.jpg|thumb|500px|left|Aufbau des DAPs mit FPGA-Board (entworfen von Thomas Pototschnig) auf Lochraster an AVR, Codec und weiterer IO]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap-Synth-01.jpg|thumb|300px|left|Synth Board. DAP mit AVR,Codec, MIDI Interface, RS232 (schaltbar) und LCD]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_Ansicht_02.jpg|thumb|300px|left|Synth Board. Komplettansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_klein_3.jpg|thumb|600px|left|Synth Board. Synth-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Oben.jpg|thumb|300px|left|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Unten.jpg|thumb|300px|right|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Träger-und-Mainboard.jpg|thumb|600px|left|Selbstgeroutetes DAP-Board auf Trägerplatine]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Seite.jpg|thumb|300px|left|DAP-Board mit Touch-Display Seitenansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display.jpg|thumb|600px|left|DAP-Board mit Touch-Display]]&lt;br /&gt;
&lt;br /&gt;
Diese Version des DAP hat ein Grafikdisplay incl. Touchpanel. Die Ansteuerung übernimmt der FPGA. Dort ist einer kleiner &amp;quot;Grafik-Prozessor&amp;quot; integriert der das Update des Displays und das Kopieren der Bitmaps übernimmt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synthesizer Ansicht 1.jpg|thumb|600px|left|]]&lt;br /&gt;
Synth-Board. Komplettansicht in einem Cherry-Tastaturgehäuse (wie dafür gemacht :-)) im Synthesizer-Stil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synth Komplett.jpg|thumb|600px|left|Fertige Version des DAP als Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
Der komplette Synthesizer mit schicker Frontplatte und passendem (oben schon erwähnten :-)) Cherry-Tastatur-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Version 1.5.jpg|thumb|600px|left|Heue Hardware Version der DAP Hauptplatine]]&lt;br /&gt;
&lt;br /&gt;
Diese Version beinhaltet folgendes : :-) &lt;br /&gt;
&lt;br /&gt;
 - Xilinx XC3S400&lt;br /&gt;
 - ATmega2561&lt;br /&gt;
&lt;br /&gt;
 - 16 MByte (8Mx16) SDRAM&lt;br /&gt;
 - µSD Card Slot&lt;br /&gt;
 - AT45DB321 DataFlash&lt;br /&gt;
 - 24C512 EEProm&lt;br /&gt;
&lt;br /&gt;
 - TLC320AI23B Audio Codec mit Kopfhörer Ausgang&lt;br /&gt;
 - CS5343 A/D Wandler&lt;br /&gt;
 - CS4344 D/A Wandler&lt;br /&gt;
&lt;br /&gt;
 - MIDI&lt;br /&gt;
 - RS232&lt;br /&gt;
 - etlichen IO-Pins vom AVR und FPGA&lt;br /&gt;
 - 2 separaten Clock-Oszillatoren (nicht bestückt)&lt;br /&gt;
&lt;br /&gt;
... und weiterem Kleinkram (LevelShifter, LDO, Platformflash, usw ... und vielen 100nFern)&lt;br /&gt;
&lt;br /&gt;
Ideal zum Aufbau einer Audio-Platform. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audio Demos==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein EQ-Demo mit Rosa Rauschen. Klingt wie eine Meeresbrandung.&lt;br /&gt;
&lt;br /&gt;
[[Media:eq_demo1.zip]]&lt;br /&gt;
&lt;br /&gt;
Der DAP als Synth. Der DAP wird komplett vom PC aus gesteuert (Hüllkurve, Sequencer und Filterberechnung werden im PC gemacht).&lt;br /&gt;
&lt;br /&gt;
[[Media:synthdemo1.wav.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MC505 Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen von meiner Roland-MC505 Groovebox. Es wird einfach nur ein Werkspreset abgespielt und durch den DAP gejagt.&lt;br /&gt;
&lt;br /&gt;
* [[Media:mc505-eq-demo.wav.zip|EQ-Demo]]&lt;br /&gt;
* [[Media:mc505-filter-demo.wav.zip|Filter-Demo (Tiefpass/Hochpass/Notch)]]&lt;br /&gt;
* [[Media:mc505-delay-demo.wav.zip|Delay-Demo (137BPM [657ms &amp;amp; 876 ms]/Chorus)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Synth Board Audio Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen vom DAP in Verbindung mit einem AVR der die Filterkoeffizientenberechnung sowie eine komplette Synthesizer-Steuerung beinhaltet, also qausi einen Synthesizer aus dem DAP macht (inkl. MIDI-Steuerung).&lt;br /&gt;
&lt;br /&gt;
MIDI-Sequenz und Tiefpass-Filter (Filter und Modulation über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-01.mp3]]&lt;br /&gt;
&lt;br /&gt;
Diesselbe MIDI-Sequenz mit Hochpass-Filter (Filter und Modulation ebenfalls über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-02.mp3]]&lt;br /&gt;
&lt;br /&gt;
Ein eher Techno-ähnliches Demo, welches die Auflösung des Systems (DAP+AVR+MIDI) ein wenig zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap_syn_demo_03.mp3]]&lt;br /&gt;
&lt;br /&gt;
==Delphi Tools==&lt;br /&gt;
&lt;br /&gt;
Um den DAP nutzbar zu machen benötigt man entweder ein uC Programm oder ein PC Programm. Da das verwenden von PC-Programmen einfacher fürs Spielen und Experimentieren ist, werde ich hier im Laufe der Zeit kleine Demo-Programme aber auch komplette Front-Ends für den DAP reinstellen. Die Delphi-Programme sind allesamt in Turbo-Delphi geschrieben und die dazugehörigen Quellcodes werden ebenfalls im Laufe der Zeit geuploaded. Ich werde allerdings zuerst noch das Feature des Konfigurierens der Codecs vom PC aus einbauen. &lt;br /&gt;
Nachtrag zum Konfigurieren des Codecs : Prinzipiell funktioniert es, allerdings ist das mit häßlichen Nebengeräuschen verbunden, da ich bei jeder Änderung der Lautstärke im Codec, diesen auch Resetten muß, da sonst immer beide Codecs beschrieben werden, was unschön ist. Warum dies so ist kann ich leider nicht sagen, da ich keine Möglichkeit habe die SPI-Leitungen mitzusniffen (bräuchte dafür einen kleinen LA, den ich nicht habe). &lt;br /&gt;
&lt;br /&gt;
* Demo eines 3 Band Stereo Equalizers. (Der Knopf &amp;quot;MoveIt!&amp;quot; bringt Leben ins Demo): [[Media:dap_eq_demo.zip]]&lt;br /&gt;
* Demo eines 4 Kanal Mono Mixers mit Monitor (Vorhör)-Ausgang: [[Media:dap_mix_demo.zip]]&lt;br /&gt;
* Demo eines Synthesizer-Filters: [[Media:dap_filter_demo.zip]]&lt;br /&gt;
* Demo eines 2 Kanal Delays (Der Button &amp;quot;MoveIt!&amp;quot; macht daraus einen Chorus :-))): [[Media:dap_delay_demo.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Quellcodes für das EQ-Demo, das Filter-Demo und das Delay-Demo : [[Media:dap_demos_plus_delphi_source.zip]]&lt;br /&gt;
&lt;br /&gt;
Es folgen noch der Quellcode für den Mischer (hab ich gerade nicht zur Hand) und weitere Demos (ein Synthesizer und eine 4x4 Patchbay mit EQ und was mir sonst noch einfällt. Dann natürlich mit Source-Codes).&lt;br /&gt;
Anhand dieser Beispiele wird auch eine grobe Doku erstellt.&lt;br /&gt;
&lt;br /&gt;
== SVN-Repository ==&lt;br /&gt;
&lt;br /&gt;
 svn co svn://mikrocontroller.net/audiodsp&lt;br /&gt;
&lt;br /&gt;
Ein automatisch aktualisiertes Paket mit den Daten aus dem Repository gibt es unter http://www.mikrocontroller.net/download/audiodsp-snapshot.tar.gz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
&lt;br /&gt;
* 12.07.2007: Es wurde ein generisches Speicherinterfaces welches Wartezyklen im DAP erlaubt implementiert. Dadurch kann man auf die jeweilgen Speicher des Boards eingehen. Z.Z. ist nur ein einfaches Speicherinterface für den asynchronen Betrieb des PSDRAM des Nexys Boards implementiert. Das Interface ermögicht es einen RAM Controller anzuschließen welcher z.&amp;amp;nbsp;B. ein quasi-Multiport RAM darstellt. Getestet wurde der Stand mit dem Nexys-1000 Board.&lt;br /&gt;
&lt;br /&gt;
==To do==&lt;br /&gt;
&lt;br /&gt;
* nähere Zukunft&lt;br /&gt;
** Einen Konfigurationsdialog in die Demo-Programme einarbeiten mit denen man mit den Codecs etwas spielen kann (Line-In Level, Mikrofon-Level, Bypass, Head-Phone Volume) tlw. erledigt. Funktioniert aber nicht richtig, und daher noch nicht eingebaut. Quellcodes dazu sind vorhanden.&lt;br /&gt;
** Doku anhand der Demo-Programme erstellen&lt;br /&gt;
** C-Code schnipsel erstellen&lt;br /&gt;
&lt;br /&gt;
* fernere Zukunft&lt;br /&gt;
** Front-End des DAPs machen, mit dem sich DAP-Programme erstellen lassen, der Koeffizienten-, Daten- und Wellenform-Speicher beschrieben und gelesen werden kann, der Mikro-Code editierbar gemacht wird und noch ein paar Sachen mehr machbar sind&lt;br /&gt;
** weitere Module für den Rahmen (HDD-Core, weitere Routing-Möglichkeiten innerhalb der bisherigen Cores SDSP und Util)&lt;br /&gt;
&lt;br /&gt;
==Diskussion==&lt;br /&gt;
* http://www.mikrocontroller.net/topic/65205&lt;br /&gt;
* http://www.mikrocontroller.net/topic/34376&lt;br /&gt;
&lt;br /&gt;
Falls Interesse an einer Sammelbestellung für die Platinen und Bauteile besteht &lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/144288&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]] &lt;br /&gt;
[[Kategorie:Audio]]&lt;br /&gt;
[[Kategorie:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66877</id>
		<title>Audio-DSP mit Spartan 3-FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66877"/>
		<updated>2012-06-14T21:28:49Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* Nachbau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [[Benutzer:TheMason]]&lt;br /&gt;
&lt;br /&gt;
==Ziel==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projekts ist es, eine FPGA-basierte Plattform aufzubauen mit der es möglich ist Synthesizer, Effektgeräte, Mischpulte  oder gar ein Harddiskrecording-System zu realisieren.&lt;br /&gt;
&lt;br /&gt;
==Feature-Liste==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften des Audio-Prozessors: &lt;br /&gt;
&lt;br /&gt;
* Oszillatoren&lt;br /&gt;
* Biquads (Filter)&lt;br /&gt;
* Addierer, Schalter, Verstärker (Multiplizierer)&lt;br /&gt;
* Delays&lt;br /&gt;
* Steuerung des Audio-Prozessors via SPI oder RS232&lt;br /&gt;
* 4 Mono Ein- und Ausgänge&lt;br /&gt;
* GPO (General Purpose Outputs) zur Konfiguration der Codecs&lt;br /&gt;
&lt;br /&gt;
==Übersicht==&lt;br /&gt;
[[Bild:Overview_wo_uc.jpg|thumb|500px]]&lt;br /&gt;
Basis des Audio-Systems ist das Xilinx Spartan 3-Development Board. An diesem Board werden 2 Audio-Codecs angschlossen von denen einer als Master und der andere als Slave agiert. Optional kann noch ein Mikrocontroller angeschlossen werden welcher den FPGA per SPI steuert. Da dieses Projekt mittlerweile recht umfangreich geworden ist, kann ich hier nur einen kurzen Umriss des Systems geben. Dabei beschränke ich mich auf die grobe Funktionsweise des Audio-Prozessors, erläutere das Interface (welches ich als Basis für weitere Projekte bereits nutze) und gebe einen kleinen Überblick über die Hardware.&lt;br /&gt;
&lt;br /&gt;
Das System kann (sofern man 2 Audio-Codecs, von denen einer als Master, der andere als Slave arbeitet, angeschlossen und konfiguriert hat) direkt genutzt werden, da der DAP per RS232 gesteuert werden kann. Der Audio-Prozessor startet mit einem Stereo-Tiefpass-Filter der sich auf den ersten Codec bezieht,&lt;br /&gt;
sodass man ein erstes Demo hat (selbst wenn es etwas unspektakulär ist)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nachbau==&lt;br /&gt;
&lt;br /&gt;
Wer sich dieses System nachbauen möchte, benötigt zunächst ein FPGA-Board. Mit dem Spartan-3-Board von Digilent gestaltet sich der Nachbau einfach, weil die Programmier-Dateien für den FPGA direkt für dieses Board verwendet werden können. Nutzer anderer Boards (Xilinx) müssten zuerst die UCF-Datei für die Pins ihres jeweiligen Boards anpassen, und dieses Projekt neu synthetisieren (compilieren). Nutzer von Altera-Boards hingegen müssen die BlockRAM-Instanzen auf die Altera-Architektur anpassen (den Inhalt der RAMs dabei nicht vergessen :-). Vielleicht findet sich ja der eine oder andere der den VHDL Code für Altera-FPGAs portiert.&lt;br /&gt;
Der eigentliche wichtige Teil eines Nachbaus ist der Codec-Teil. Dieses System verwendet zwar zwei Codecs, aber es kann auch mit einem gearbeitet werden. Als Codec kommt der TLV320AIC23B von Texas Instruments zum Einsatz. Diesen kann man als kostenloses Muster bei TI direkt bekommen. &lt;br /&gt;
Des weiteren benötigt man noch eine handvoll Bauteile wie Kondensatoren, Widerstände und einen Quarz. (Ein Codec MUSS als Master laufen, sonst hat das System keine Audio-Clocks, da diese nicht vom FPGA generiert werden)&lt;br /&gt;
Die Initialisierung des Codecs wird vom PC aus gemacht. Dazu dienen die 4 GPO-Leitungen auf dem B1-Verbinder. Da der Codec nur &amp;quot;halbes&amp;quot; SPI unterstüzt (man kann nur schreiben, nicht lesen) gestaltet sich die Initialisierung recht einfach.&lt;br /&gt;
Die 4 GPO-Leitungen teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* Chip-Select Codec 2&lt;br /&gt;
* Chip-Select Codec 1&lt;br /&gt;
* SPI Data Out&lt;br /&gt;
* SPI Clock&lt;br /&gt;
&lt;br /&gt;
==Audio-Prozessor (DAP)==&lt;br /&gt;
&lt;br /&gt;
[[bild:Overview dap core.JPG|thumb|500px|right]]&lt;br /&gt;
&lt;br /&gt;
Der FPGA beinhaltet in dem gesamten System einen Quasi-DSP. Quasi-DSP deshalb, da die Struktur im Gegensatz zu einem DSP bzw. Mikrocontroller keine Verzweigungen, Interrupts oder ähnliches zulässt. Der Audio-Prozessor besteht im wesentlichen aus 3 Teilen : Einem Rahmen, einem SDSP (Small DSP)-Kern &lt;br /&gt;
sowie einem Utility-Kern. Beide Kerne können theoretisch parallel arbeiten, da jeder Kern eine eigene Statemachine und einen eigenen Mikro-Code Speicher besitzen. Dieses Feature ist allerdings noch nicht implementiert.&lt;br /&gt;
&lt;br /&gt;
Der SDSP-Kern besteht im wesentlichen aus einer MAC-Einheit, einem Speicher für Audio-Daten, einem Koeffizienten-Speicher, einem Adress-Generator und mehreren Muxern, sowie der schon angesprochenen Statemachine und dem Microcode. Weiterhin ist ein Hidden-Write- (bzw. Shadow Register) Mechanismus integriert,&lt;br /&gt;
welcher ein &amp;quot;knackser-freies&amp;quot; Updaten von Koeffizienten ermöglicht. Alle diese Komponenten werden vom MicroCode aus gesteuert (genau wie bei einem Mikrocontroller). Mit diesem Kern ist es möglich, Audio-Signale zu bearbeiten. Zu Den Bearbeitungsmöglichkeiten zählen in erster Linie das Verändern der Lautstärke, Mischen, Filtern (Biquad) sowie Laden und Speichern von &lt;br /&gt;
Audio-Werten.&lt;br /&gt;
&lt;br /&gt;
Der Utility Kern besteht aus einem Akkumulator (für DDS), einem Shaper, einem Adress-Generator, einem Wavetable-Speicher, einem Random-Number Generator, einigen Muxern, (einem Adress-Generator für SRAM, einem SRAM-Controller; diese sind allerdings nur nutzbar wenn man das ganze mit dem ISE 6.2 synthetisiert) &lt;br /&gt;
und der schon angesprochenen Statemachine und dem MicroCode. Der MicroCode steuert (genau wie beim SDSP-Kern) dabei die einzelnen Komponenten des Utility Kerns. Dieser kern ist für das Erzeugen von Audio-Signalen zuständig, und erlaubt ein Audio-Signal zu verzögern, sofern man die ISE-Version 6.2 Verwendet (später dazu mehr). Als Wellenformen stehen Sägezahn, Rechteck (mit veränderbarem Puls/Pausen-Verhältnis), Rauschen sowie benutzderdefinierbare Wellenformen (Wavetable) zur verfügung.&lt;br /&gt;
&lt;br /&gt;
Der Rahmen besteht aus einer Statemachine, einem Programm-Speicher, einigen Muxern, sowie einem doppelten I2S Sender-Empfänger (für 2 Stereo Ein- und Ausgänge). In dem Rahmen werden die beiden Kerne &amp;quot;eingehängt&amp;quot;. Die Kerne werden vom Programmspeicher aus mit Daten versorgt, und von der Statemachine angetriggert. Der Programmspeicher (PMEM) ist als 512x32 Bit organisiert. Das heißt das ein Befehl im Programmspeicher 32 Bit Informationen enthält und der &lt;br /&gt;
Audio-Prozessor max. 512 Befehle umfassen kann.&lt;br /&gt;
&lt;br /&gt;
===SDSP-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:SDSP-Struct.jpg|thumb|300px|left|Struktur des SDSP-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Der eigentliche Kern des DAPs ist die MAC-Einheit. Mit ihr werden die grundlegenden Operationen Multiplikation und Addition durchgeführt. Es ist eine 32x32 Bit Einheit. &lt;br /&gt;
Die Funktionsweise des Kerns ist eigentlich recht einfach. &lt;br /&gt;
Die MAC-Einheit hat 2 Eingänge. Einer dieser Eingänge kann ein Audio-Signal, ein Wert aus dem Audio-Speicher (AMEM-BlockRAM) oder ein zuvor berechnetes Ergebnis sein. Der andere Eingang kann ein Koeffizient aus dem CMEM-BlockRAM oder eine Konstante (1.000, 0.000 oder -1.000) sein.&lt;br /&gt;
Der Ausgang (32-Bit, hardgeclippt) geht auf das AMEM-BlockRAM und zum Ausgangs-Clipping. Das Ausgangsclipping schneidet das Audio-Signal auf 24-Bit zurecht.&lt;br /&gt;
Die Adressen für die Speicher (AMEM und CMEM) werden im Address-Generator erzeugt. Dieser wird von außen mit einer 8-bit Basis-Adresse gespeist und erzeugt einen Offset zu den Eingangs Adressen. Er besitzt 2 setzbare Zähler und einige Multiplexer.&lt;br /&gt;
Alle Steuerignale der Komponenten von einem weiteren aus BlockRAM (MMEM) versorgt. Weiterhin wird von außen eine Start-Adresse vorgegeben. Dadurch lassen sich quasi Opcodes mit von außen vorgegeben Parametern (Adressen) aufrufen.&lt;br /&gt;
Das MMEM-BlockRAM wird nun einfach nur linear ausgelesen bis ein Stop-Bit gesetzt ist. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Util-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Util-Core.jpg|thumb|300px|left|Struktur des Utility-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Beschreibung folgt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opcodes des DAP===&lt;br /&gt;
&lt;br /&gt;
Diese 32 Bit eines Befehls teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* 4 Bit = Opcode (für SDSP und Utility Kern gleich)&lt;br /&gt;
* 2 Bit = noch leer&lt;br /&gt;
* 1 Bit = Core Select (SDSP oder Utility)&lt;br /&gt;
* 1 Bit = Ende des Programms&lt;br /&gt;
* 4 Bit = Eingangs-Routing (Kanal 1 - 4, Ergebnis SDSP Core, Ergebnis Utility Core)&lt;br /&gt;
* 4 Bit = Ausgangs-Routing (SDSP-Ausgang auf Kanal 1-4, Utility Ausgang auf Kanal 1-4)&lt;br /&gt;
* 8 Bit = Adresse 1 (bei SDSP für Audio-Memory, bei Utility Kern für Data Memory)&lt;br /&gt;
* 8 Bit = Adresse 2 (bei SDSP für Koeffizienten-Memory, bei Utility Kern unbenutzt)&lt;br /&gt;
&lt;br /&gt;
Das Eingangsrouting bestimmt mit welchem Signal der gewählte Kern arbeiten soll. Dies können die Eingänge 1-4 sein, aber auch ein vorher berechnetes Ergebnis des SDSP- bzw. Utility-Kerns sein. Das Ausgangsrouting bestimmt von welchem Kern das Signal auf welchen Ausgang geroutet wird.&lt;br /&gt;
&lt;br /&gt;
Die Opcodes des DAPs sind:&lt;br /&gt;
&lt;br /&gt;
SDSP-Kern:&lt;br /&gt;
* Biquad rechnen&lt;br /&gt;
* Audio Wert speichern&lt;br /&gt;
* Audio Wert laden&lt;br /&gt;
* Move eines Wertes im Audio-Speicher&lt;br /&gt;
* Summe resetten&lt;br /&gt;
* Eingang zu Summe addieren&lt;br /&gt;
* Wert aus dem Audio-Speicher zu Summe addieren&lt;br /&gt;
* Eingang zu summe mischen (mit Lautstärke Koeffizient)&lt;br /&gt;
* wert aus dem Audio-Speicher zu Summe mischen (mit Lautstärke Koeffizient)&lt;br /&gt;
* Lautstärke &lt;br /&gt;
&lt;br /&gt;
Utility-Kern:&lt;br /&gt;
* Oszillator (DDS-Teil)&lt;br /&gt;
* Waveshaper&lt;br /&gt;
* Delay&lt;br /&gt;
&lt;br /&gt;
Der Ablauf eines Audio-Programms ist folgender:&lt;br /&gt;
&lt;br /&gt;
Sobald ein neues Sample anliegt, wird die Abarbeitung des Programms von Adresse 0x0000 an im PMEM angestossen. Es wird dabei jeweils ein Befehl geladen und Daten wie Opcode und Adressen liegen dabei an beide Kernen gleichermaßen an. Ist das Programm-Ende Bit nicht gesetzt so wird der jeweilige Kern (mit dem im Opcode angegeben Routing) angetriggert. Legt der betreffende Kern sein Ready Signal auf 1, so wird der nächste Befehl abgearbeitet. Dieses Verhalten (Laden und Verteilen von Opcode-Daten, sowie die Ablaufsteuerung; also das Antriggern des Programms, Antriggern der einzelnen Kerne, warten auf dessen Abarbeitung und das Programm-Ende) wird vom Rahmen übernommen.&lt;br /&gt;
&lt;br /&gt;
===Speicherorganisation===&lt;br /&gt;
&lt;br /&gt;
Alle Speicher die vom DAP angesprochen werden haben eine Wort-Breite von 32 Bit, der Zugriff erfolgt aber ausschließlich über 8 Bit Breite (Interface).&lt;br /&gt;
&lt;br /&gt;
DAP&lt;br /&gt;
* Programmspeicher 	(PMEM)   0x0000 - 0x07ff&lt;br /&gt;
&lt;br /&gt;
SDSP&lt;br /&gt;
* Audio-Speicher   	(AMEM)   von außen nicht zugänglich&lt;br /&gt;
* Koeffizienten-Speicher 	(CMEM)   0x2000 - 0x2023  (man &amp;quot;sieht&amp;quot; nur den Hidden Write -&amp;gt; später mehr dazu)&lt;br /&gt;
* Microcode-Speicher      (MMEM)   0x4000 - 0x47ff&lt;br /&gt;
&lt;br /&gt;
Utility-Core&lt;br /&gt;
* Daten-Speicher          (DMEM)   0x6000 - 0x67ff&lt;br /&gt;
* Wavetable Speicher      (WMEM)   0x8000 - 0x87ff&lt;br /&gt;
* MicroCode-Speicher      (UMEM)   0xa000 - 0xa7ff&lt;br /&gt;
&lt;br /&gt;
===Hidden-Write===&lt;br /&gt;
Um bei Änderung der Koeffizienten &amp;quot;Knackser&amp;quot; zu vermeiden (die dadurch entstehen das der Koeffizient nur teilweise [durch 8 Bit Zugriffe] geändert wird, währenddessen aber Audio trotzdem noch &amp;quot;weiterläuft&amp;quot;, und mit &amp;quot;falschen&amp;quot; Zwischenwerte gerechnet wird) ist ein Mechanismus implementiert der die zu ändernden Koeffizienten im Hintergund in den Speicher schreibt. Um diesen Mechanismus zu nutzen müssen zuerst die Koeffizienten in interne Register&lt;br /&gt;
geschrieben werden. Die Register (es sind 8 32 Bit Register) liegen im Speicherbereich 0x2000 bis 0x201f. Die Speicherstelle 0x2020 gibt die Start-Adresse innerhalb des Koeffizienten Speichers an. Diese Adresse ist nur 8 Bit breit. Die Speicherstelle 0x2021 gibt an wieviele der 8 Register übertragen werden sollen. Die Speicherstelle 0x2022 triggert den Kopier-Vorgang an. Hier reicht es ein Dummy byte zu schreiben. Um den Kopiervorgang zu beenden (MUß GEMACHT WERDEN!!, sonst können keine weiteren Koeffizienten Updates gemacht werden) schreibt man an Speicherstelle 0x2023 ebenfalls ein Dummy Byte.&lt;br /&gt;
&lt;br /&gt;
===I/O Register===&lt;br /&gt;
&lt;br /&gt;
Es gibt noch einen 8-Bit breiten Adress-Bereich innerhalb des DAPs, mit dem der I2S-Teil gemutet werden kann. Weiterhin hat man die Möglichkeit, die Anzahl der System-Takte pro Sample und die Anzahl der aktiven System-Takte (also die Zeit die der Audio-Prozessor beschäftigt ist) zu ermitteln. Dadurch lässt sich eine Auslastungsanzeige des DAPs realisieren.&lt;br /&gt;
&lt;br /&gt;
===Interface===&lt;br /&gt;
&lt;br /&gt;
Um von außen nun ein Programm (bzw. Koeffizienten und Daten) zu laden ist ein Interface implementiert, welches einfach zu handhaben ist und einfach erweitert werden kann. Das Interface kann per RS232 (fest eingestellt auf 115,2kBaud) oder per SPI (wird Hardware-Mässig eingestellt) angesteuert werden. Das Interface in seiner Gesamtheit ist schichtweise aufgebaut und beginnt mit einem Data-Dispatcher. Dieser Data-Dispatcher entscheidet (nach dem dieser selektiert wurde) mit dem ersten Byte, an welches angeschlossene Gerät der weitere Datenstrom geleitet wird.&lt;br /&gt;
&lt;br /&gt;
Als angeschlossene Geräte sind im aktuellen Design ein Gerät namens &amp;quot;StdIO&amp;quot; und der Audio-Prozessor angeschlossen.&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;StdIO&amp;quot; Gerät steuert die 7Segment-Anzeige (16-Bit Hexadezimal Anzeige oder 32-Bit Einzelsegment Anzeige), die 8 Leuchtdioden, und erlaubt es die 3 Drucktaster sowie die 8 Schiebeschalter auszulesen.&lt;br /&gt;
&lt;br /&gt;
Der Audio-Prozessor besteht (Interface-seitig gesehen) nur aus einem Speicher-Zugriffs-Interface. Dieses Speicher-Interface entscheidet mit dem ersten Byte (sobald es selektiert wurde) ob in den Speicher geschrieben, von diesem gelesen, ein I/O Schreib oder Lese Zugriff erfolgen soll.&lt;br /&gt;
Die Folgenden 2 Bytes (im Falle eines I/O Zugriffs nur 1 Byte) bestimmen die Adresse und damit den Speicher-Bereich des Audio-Prozessors auf den Zugegriffen werden soll. Das Speicherinterface besitzt einen Autoincrement,&lt;br /&gt;
mit dem fortalufende Bytes einfach hintereinander weggeschrieben werden können, ohne das jedesmal wieder der FPGA, das Gerät und die neue Adresse neu geschrieben werden müssen, was den Zugriff erheblich beschleunigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ursprünglich basierte das System auf einem SPI-Interface. Dabei wurde die Chip-Select Leitung als &amp;quot;globaler&amp;quot; Interface Reset betrachtet, d.h. war die Leitung auf High, war der FPGA Deselektiert und und alle Interface-Statemachines wurden im Reset gehalten. Erst mit dem Setzen dieser Leitung wurde der FPGA angesprochen. (erstes Byte -&amp;gt; Daten-Dispatcher, folgende Bytes gehen an das Gerät, wenn eines ausgewählt wurde). Weiterhin hat SPI die Eigenschaft das mit jedem gesendeten Byte auch eines Emfpangen wurde. Der Umstand das RS232 weder eine Chip-Select Leitung benötigt, noch eine synchrone Übertragung erzwingt führt zu dem Umstand das man bei Nutzung von RS232 einige Befehle zusätzlich benötigt. Diese Befehle werden durch das Zeichen 0x1b (ESC) eingeleitet. Soll statt der &amp;quot;Spezial-Funktion&amp;quot; das Byte 0x1b übertragen werden, so wird dieses einfach erneut gesendet. Soll die Chip-Select leitung gesetzt bzw. gelöscht werden so wird die Sequenz 0x1b 0x00 (Selektieren) bzw.&lt;br /&gt;
0x1b 0x01 (Deselektieren) gesendet. Soll ein zuvor im Ausgangsregister gesetztes Byte gesendet werden so muß die Sequenz 0x1b 0x02 gesendet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
0x121b auf dem 7 Segment Display per RS232 Anzeigen:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA Selektieren)&lt;br /&gt;
*- 0xf0      (StdIO Selektieren)&lt;br /&gt;
*- 0x00      (Hi Byte der 7 Segment Hex Anzeige wählen)&lt;br /&gt;
*- 0x12      (Wert 12)&lt;br /&gt;
*- ESC 0x01  (FPGA Deselektieren)&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA Selektieren)&lt;br /&gt;
*- 0xf0      (StdIO Selektieren)&lt;br /&gt;
*- 0x01      (Lo Byte der 7 Segment Hex Anzeige wählen)&lt;br /&gt;
*- 0x1b 0x1b (Wert 1b -&amp;gt; zu beachten: wenn der Wert 0x1b übertragen werden muß, muß dieser doppelt gesendet werden !!)&lt;br /&gt;
*- ESC 0x01  (FPGA Deselektieren)&lt;br /&gt;
&lt;br /&gt;
Beispiel um in den Programmspeicher des Audio-Prozessors an Adresse 0x0010 das Langwort 0x12233445 zu schreiben:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA Selektieren)&lt;br /&gt;
*- 0xf1      (DAP Selektieren)&lt;br /&gt;
*- 0x00      (Speicher Schreiben)&lt;br /&gt;
*- 0x00      &lt;br /&gt;
*- 0x10      (Adresse 0x0010 -&amp;gt; PMEM Adresse 0x010)&lt;br /&gt;
*- 0x12	    (Adresse 0x0010 -&amp;gt; 0x12)	&lt;br /&gt;
*- 0x23	    (Adresse 0x0011 -&amp;gt; 0x23, autoincrement)&lt;br /&gt;
*- 0x34      (Adresse 0x0012 -&amp;gt; 0x34, autoincrement)&lt;br /&gt;
*- 0x45      (Adresse 0x0013 -&amp;gt; 0x45, autoincrement)&lt;br /&gt;
*- ESC 0x01  (FPGA Deselektieren)&lt;br /&gt;
&lt;br /&gt;
Auslesen der 8 Schalter:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA Selektieren)&lt;br /&gt;
*- 0xf0      (StdIO Selektieren)&lt;br /&gt;
*- 0x04      (Schalter auslesen)&lt;br /&gt;
*- 0x00	    (dummy byte -&amp;gt; überträgt Schalter-Stellung in Ausgabe-Register)&lt;br /&gt;
*- ESC 0x02  (Ausgabe Register übertragen, danach empfängt man die 8 Schalterstellungen binär-codiert)&lt;br /&gt;
*- ESC 0x01  (FPGA Deselektieren)&lt;br /&gt;
&lt;br /&gt;
Der Datendispatcher (welcher mit dem ersten Byte nach dem Selektieren des FPGAs [0x1b 0x00] angesprochen wird) hat weiterhin einige nützliche Funktionen die in Ihrer Gesamtheit allerdings noch nicht ausführlich getestet wurden. Darunter sind Funktionen mit denen Inrformationen über die an den Ports des Daten-Dispatchers angeschlossenen Geräte zu ermitteln. Dieses Feature kann dazu genutuzt werden um zu ermitten welche Geräte im FPGA implementiert sind und an welchen Ports welche Geräte angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
Anzahl der Ports des Daten Dispatchers liefern:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA Selektieren)&lt;br /&gt;
*- 0xed      (Anzahl Ports lesen)&lt;br /&gt;
*- 0x00      (dummy byte -&amp;gt; überträgt Inhalt des Ausgabe-Registers)&lt;br /&gt;
*- ESC 0x02  (Ausgabe Register übertragen, danach empfängt man 0x22)&lt;br /&gt;
*- ESC 0x01  (FPGA Deselektieren)&lt;br /&gt;
&lt;br /&gt;
===DAP-Modul-Schnipsel===&lt;br /&gt;
&lt;br /&gt;
Um mal &amp;quot;eben&amp;quot; mit dem DAP zu spielen, ein paar Schnipsel die sich recht leicht zu kompletten Funktionsblöcken zusammenschließen lassen.&lt;br /&gt;
Es werden hier nur die RS232 Sequenzen mit einer kurzen Erklärung aufgelistet.&lt;br /&gt;
&lt;br /&gt;
*Dual Mono Biquad&lt;br /&gt;
&lt;br /&gt;
*ESC 0x00 - FPGA Selektieren&lt;br /&gt;
*0xF1     - DAP Auswählen&lt;br /&gt;
*0x00 0x00 0x00 - Memory Write (Adresse 0x0000 -&amp;gt; Program Memory)&lt;br /&gt;
*0x10 0x00 0x00 0x08 - Biquad mit Kanal 1 (0) rechnen (AMEM = 0x00;CMEM = 0x08) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x10 0xf0 0x08 0x10 - Biquad mit vorherigem Ergebnis (0xf) rechnen (AMEM = 0x08; CMEM = 0x10) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x01 0x00 0x00 0x00 - Audio Programm Ende (wichtig !!!)&lt;br /&gt;
*ESC 0x01 - DAP &amp;amp; FPGA deselektieren&lt;br /&gt;
&lt;br /&gt;
Erklärung :&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Opcodes 0x100008 deutet an, das ein Biquad durchgerechnet werden soll. Das Eingangsregister 0 bedeutet das Kanal 1 des 1. Codecs verwendet wird. Das Ausgangsregister welches nach Fertigstellung des Ergebnisses benutzt werden&lt;br /&gt;
ist 0 (-&amp;gt; Kanal 1 des 1. Codecs). Der Teil 0x00 0x08 bedeutet hierbei, das die Biquad-Koeffizienten im CMEM ab Adresse 0x08 stehen. Die Audio-Zwischenwerte werden im Audio-Speicher AMEM ab Adresse 0x00 gelegt.&lt;br /&gt;
Der zweite Opcode (0x10f00810) rechnet ebenfalls ein Biquad durch. Nur das hier statt Kanal 1 des Codecs das voher vom SDSP berechnete Ergebnis verwendet werden soll (Kanal 0xf, wenn man so will). Ausgangsregister ist auch hier wieder Kanal 1. Da dieser Biquad unabhängig vom ersten (d.h. mit anderen Parametern) gerechnet werden soll, sind hier logischerweise auch andere Adressen für AMEM (0x08) und CMEM (0x10) angegeben. Die CMEM-Adresse ist dabei etwas unkritischer, da es ja durchaus sein kann das ein Audio-Signal zweimal mit den selben Biquad-Werten gerechnet werden soll, bzw. unterschiedliche Kanäle mit den selben Biquad-Werten, z.b. bei einem Stereo-Equalizer. Kritischer ist allerdings die Verwendung der AMEM-Adresse. Diese sollte für jede Operation (sofern AMEM denn verwendet wird) unterschiedlich sein, vor allem bei der Berechnung von Biquads. Dies hat den Grund das bei Operationen, die dieselben AMEM Adressen haben die vorher berechneten Werte überschrieben werden. Dies ist bei Biquads gaanz böse (kann u.u. SEHR laut werden), und vom Ergebnis her nicht vorhersagbar.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
[[bild:Fpga_ext_board_schematic_no_uc.JPG|thumb|500px]]&lt;br /&gt;
&lt;br /&gt;
Wie Eingangs erwähnt benötigt das System eine (bzw. zwei) Audio-Codecs. Im aktuellen Schaltplan wird auf einen Mikroprozessor verzichtet. Dieser diente im System erstmal nur zu Initialisierung der Codecs. Dieser Vorgang kann nun vom PC aus gesteuert werden, da in der neuen ISE 6.2 Version 4 Leitungen herausgeführt wurden, welche per RS232 gesetzt und gelöscht werden. &lt;br /&gt;
Wer das System nachbauen möchte kann entweder die TLV320AIC23B Codecs, aber auch beliebige andere Codecs verwenden, solange einer als Master und der andere als Slave arbeitet und beide auf den I2S Modus mit 64FS und 20 Bit Wortlänge eingestellt sind. Die Initialisierung dieser Codecs muß dann aber separat vorgenommen werden (wobei man dann wahrscheinlich nicht um einen uC drum herum kommt). Um das System zu Testen (Programme und Koeffizienten in den DAP einzuspielen) wird lediglich eine serielle Schnittstelle verwendet. Wer will kann aber genausogut den SPI-Modus verwenden und den DAP direkt von einem Mikrocontroller aus steuern. Zur Auswahl der verwendeten Schnittstelle (RS232 oder SPI) wird Pin 13 des B1-Connectors benutzt. Liegt dieser Pin auf GND so wird der FPGA per RS232 gesteuert. Liegt dieser Pin auf 3.3V so wird der FPGA per SPI gesteuert.&lt;br /&gt;
&lt;br /&gt;
Hier der Schaltplan meines verwendeten Audio-Boards.&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier noch die Pin-Belegung des B1-Expansion Connectors:&lt;br /&gt;
&lt;br /&gt;
*01 GND&lt;br /&gt;
*02 VCC 5V&lt;br /&gt;
*03 VCC 3.3V&lt;br /&gt;
*04 N.C.&lt;br /&gt;
*05 SPI_CS - Chip Select (von uC nach FPGA)&lt;br /&gt;
*06 N.C.&lt;br /&gt;
*07 SPI_DI - SPI Data In (von uC nach FPGA)&lt;br /&gt;
*08 BCLK - Bit Clock (von Master Codec)&lt;br /&gt;
*09 SPI_CLK - SPI Clock (von uC nach FPGA)&lt;br /&gt;
*10 LRCLK - LR-Clock (von Master Codec)&lt;br /&gt;
*11 SPI_DO - SPI Data Out (von FPGA nach uC)&lt;br /&gt;
*12 SDOUT1 - zum D/A Wandler (Codec) 1&lt;br /&gt;
*13 IF_SEL - Interface Select (GND = RS232; VCC3.3 = SPI)&lt;br /&gt;
*14 SDIN1 - vom A/D Wandler (Codec) 1&lt;br /&gt;
*15 RXD_OUT - RS232 Signal vom MAX232 zum uC&lt;br /&gt;
*16 SDIN2 - vom A/D Wandler (Codec) 2&lt;br /&gt;
*17 TXD_IN - RS232 Signal vom uC zum MAX232&lt;br /&gt;
*18 SDOUT2 - zum D/A Wandler (Codec) 2&lt;br /&gt;
*19 GPO 3 - Chip-Select Codec 2&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 2 - Chip-Select Codec 1&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 1 - SPI-Data out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 0 - SPI-Clock Out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
&lt;br /&gt;
==Nexys Board==&lt;br /&gt;
&lt;br /&gt;
Im SVN Repository (s.u.) gibt es eine Version des DAPs für das Nexys Board.&lt;br /&gt;
Diese ist voll SW-Kompatibel zum alten Spartan 3 Board (allerdings z.Z. nur über RS232 steuerbar). Neu bei der Version ist das das Speicherinterface generisch ausgelegt wurde und ein einfacher SRAM-Controller für das Nexys Board PSDRAM geschrieben wurde. Durch das generische Interface ist es möglich andere Speicherarten anzubinden. Der verwendete Codec ist wie schon im bisherigen Projekt der TLV320AIC23B. Dieser wird via RS232 (6-pin Port A des Nexys Boards) über die GPO Leitungen (6-pin Port D des Nexys Boards) initialisiert. Die eigentlichen Datenleitungen des Codecs liegen an Port B (BCLK, LRCLK, DIN, DOUT).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download des DAP als MCS-File für das Nexys-1000 Board : [[Media:Nexys_dap.zip]]&lt;br /&gt;
&lt;br /&gt;
Diese Version ist voll lauffähig (wurde mit den Demos getestet).&lt;br /&gt;
Die Pin Belegung für die RS232 und den Audio-Codec ist wie folgt :&lt;br /&gt;
&lt;br /&gt;
Header A : RS232 Schnittstelle&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Pin 1 : RxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : TxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V/5V für MAX232/MAX3232)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header B : I2S Schnittstelle für 1 Codec&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : BitClk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : L/R Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : SDIN&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : SDOUT&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V für den Codec)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header D : Codec-Konfiguration via SPI&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : Codec 2 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : Codec 1 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : Codec SPI Data&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : Codec SPI Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DAP mit selbstgelötetem FPGA-Board==&lt;br /&gt;
&lt;br /&gt;
Auf einen Beitrag von Thomas Pototschnig hin bin ich auf sein selbstentworfenes Spartan-3-FPGA-Board (Grafikkarte) aufmerksam geworden. Thomas hat mir die Erlaubnis gegeben dieses Board für den DAP verwenden zu können und die Schaltpläne hier zu veröffentlichen. Nachdem ich von ihm noch einige Vorversionen (nur die Platinen) ergattern konnte und diese erfolgreich aufgebaut (mit Spartan 3-200 und -400) habe bin ich von diesem Board echt begeistert. Danke nochmals.&lt;br /&gt;
&lt;br /&gt;
[[Bild:FPGA-Board.jpg|thumb|300px|left]]&lt;br /&gt;
&lt;br /&gt;
Hier der Schaltplan und Layout. &lt;br /&gt;
&lt;br /&gt;
[[Media:miniFPGA-Board.zip]]&lt;br /&gt;
&lt;br /&gt;
Das Board ist 2-seitig und die &amp;quot;schlimmsten&amp;quot; zu lötenden Bauteile sind lediglich der FPGA (QFP-144) und die beiden RAMs (SOJ36, ekelig). Der Rest ist recht einfach. Auch die Inbetriebnahme des Boards gestaltete sich recht einfach.&lt;br /&gt;
&lt;br /&gt;
Den Quellcode für den DAP mußte ich etwas ändern und abspecken. Durch den ineffizienten VHDL-Code der MAC-Einheit gestaltete es sich schwierig das Design synthetisierbar zu machen. Das Synthetisieren auf einem FT256 gestaltete sich einfacher. Hier ist noch Handlungsbedarf in der Form das die MAC-Einheit überarbeitet werden muß. &lt;br /&gt;
Das abgespeckte Design läuft auf dem FPGA-Board mit einem Spartan 3-400 sowie auf einem Spartan 3-200. &lt;br /&gt;
Den Audio-Codec, das FPGA Board, einen AVR und noch etwas IO-Kram habe ich auf eine Lochraster aufgebaut. Was noch fehlt ist ein MIDI und ein SD/MMC-Karten Interface. Dann hat man eine schöne Plattform für Synthesizer und Effektgerät.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anmerkung==&lt;br /&gt;
&lt;br /&gt;
Da wie schon gesagt das Projekt komplett auf meinem &amp;quot;Mist&amp;quot; gewachsen ist wird es wohl noch eine Weile dauern bis alles was den DAP betrifft hier in diesem Artikel (und auch in einem Dokumentations-PDF) eingearbeitet ist. Ich werde (sofern ich Zeit dazu habe) noch ein Delphi Programm mit Source-Code einstellen, welche den DAP richtig nutzbar macht und man dann direkt damit &amp;quot;spielen&amp;quot; kann. Eine umfangreiche und vollständige Dokumentation würde momentan einfach zu viel Zeit in Anspruch nehmen und ich möchte langsam das Projekt Vorstellen um Anregung, Kritik und Verbesserungsvorschläge ernten zu können. Ich hoffe noch Leute zu finden um diesem Projekt noch mehr Leben und Möglichkeiten einhauchen zu können.&lt;br /&gt;
&lt;br /&gt;
==Fotos==&lt;br /&gt;
&lt;br /&gt;
Ursprüngliche Version:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Gesamt_wo_uc.jpg|thumb|200px|left|Spartan3 Board und Expansion Board]]&lt;br /&gt;
[[Bild:Codecs.jpg|thumb|200px|left|Expansion Board]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nexys-Board:&lt;br /&gt;
[[Bild:dap_nexys_v1.jpg|thumb|200px|left|Nexys Board mit 1 Audio-Codec]]&lt;br /&gt;
[[Bild:Nexys-board-gesamt.jpg|thumb|200px|left|Nexys Board mit Lochraster-Board und 2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
[[Bild:Nexys-board-codecs-1.jpg|thumb|200px|left|2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufbau von [[Benutzer:Andreas]]:&lt;br /&gt;
[[Bild:Nexys-Audio-DSP-Foto-Andreas.jpg|thumb|600px|left|Nexys + Breadboard + 1 [[Audio Codec Board]]]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Synth-gesamt-klein.jpg|thumb|500px|left|Aufbau des DAPs mit FPGA-Board (entworfen von Thomas Pototschnig) auf Lochraster an AVR, Codec und weiterer IO]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap-Synth-01.jpg|thumb|300px|left|Synth Board. DAP mit AVR,Codec, MIDI Interface, RS232 (schaltbar) und LCD]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_Ansicht_02.jpg|thumb|300px|left|Synth Board. Komplettansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_klein_3.jpg|thumb|600px|left|Synth Board. Synth-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Oben.jpg|thumb|300px|left|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Unten.jpg|thumb|300px|right|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Träger-und-Mainboard.jpg|thumb|600px|left|Selbstgeroutetes DAP-Board auf Trägerplatine]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Seite.jpg|thumb|300px|left|DAP-Board mit Touch-Display Seitenansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display.jpg|thumb|600px|left|DAP-Board mit Touch-Display]]&lt;br /&gt;
&lt;br /&gt;
Diese Version des DAP hat ein Grafikdisplay incl. Touchpanel. Die Ansteuerung übernimmt der FPGA. Dort ist einer kleiner &amp;quot;Grafik-Prozessor&amp;quot; integriert der das Update des Displays und das Kopieren der Bitmaps übernimmt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synthesizer Ansicht 1.jpg|thumb|600px|left|]]&lt;br /&gt;
Synth-Board. Komplettansicht in einem Cherry-Tastaturgehäuse (wie dafür gemacht :-)) im Synthesizer-Stil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synth Komplett.jpg|thumb|600px|left|Fertige Version des DAP als Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
Der komplette Synthesizer mit schicker Frontplatte und passendem (oben schon erwähnten :-)) Cherry-Tastatur-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Version 1.5.jpg|thumb|600px|left|Heue Hardware Version der DAP Hauptplatine]]&lt;br /&gt;
&lt;br /&gt;
Diese Version beinhaltet folgendes : :-) &lt;br /&gt;
&lt;br /&gt;
 - Xilinx XC3S400&lt;br /&gt;
 - ATmega2561&lt;br /&gt;
&lt;br /&gt;
 - 16 MByte (8Mx16) SDRAM&lt;br /&gt;
 - µSD Card Slot&lt;br /&gt;
 - AT45DB321 DataFlash&lt;br /&gt;
 - 24C512 EEProm&lt;br /&gt;
&lt;br /&gt;
 - TLC320AI23B Audio Codec mit Kopfhörer Ausgang&lt;br /&gt;
 - CS5343 A/D Wandler&lt;br /&gt;
 - CS4344 D/A Wandler&lt;br /&gt;
&lt;br /&gt;
 - MIDI&lt;br /&gt;
 - RS232&lt;br /&gt;
 - etlichen IO-Pins vom AVR und FPGA&lt;br /&gt;
 - 2 separaten Clock-Oszillatoren (nicht bestückt)&lt;br /&gt;
&lt;br /&gt;
... und weiterem Kleinkram (LevelShifter, LDO, Platformflash, usw ... und vielen 100nFern)&lt;br /&gt;
&lt;br /&gt;
Ideal zum Aufbau einer Audio-Platform. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audio Demos==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein EQ-Demo mit Rosa Rauschen. Klingt wie eine Meeresbrandung.&lt;br /&gt;
&lt;br /&gt;
[[Media:eq_demo1.zip]]&lt;br /&gt;
&lt;br /&gt;
Der DAP als Synth. Der DAP wird komplett vom PC aus gesteuert (Hüllkurve, Sequencer und Filterberechnung werden im PC gemacht).&lt;br /&gt;
&lt;br /&gt;
[[Media:synthdemo1.wav.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MC505 Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen von meiner Roland-MC505 Groovebox. Es wird einfach nur ein Werkspreset abgespielt und durch den DAP gejagt.&lt;br /&gt;
&lt;br /&gt;
* [[Media:mc505-eq-demo.wav.zip|EQ-Demo]]&lt;br /&gt;
* [[Media:mc505-filter-demo.wav.zip|Filter-Demo (Tiefpass/Hochpass/Notch)]]&lt;br /&gt;
* [[Media:mc505-delay-demo.wav.zip|Delay-Demo (137BPM [657ms &amp;amp; 876 ms]/Chorus)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Synth Board Audio Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen vom DAP in Verbindung mit einem AVR der die Filterkoeffizientenberechnung sowie eine komplette Synthesizer-Steuerung beinhaltet, also qausi einen Synthesizer aus dem DAP macht (inkl. MIDI-Steuerung).&lt;br /&gt;
&lt;br /&gt;
MIDI-Sequenz und Tiefpass-Filter (Filter und Modulation über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-01.mp3]]&lt;br /&gt;
&lt;br /&gt;
Diesselbe MIDI-Sequenz mit Hochpass-Filter (Filter und Modulation ebenfalls über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-02.mp3]]&lt;br /&gt;
&lt;br /&gt;
Ein eher Techno-ähnliches Demo, welches die Auflösung des Systems (DAP+AVR+MIDI) ein wenig zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap_syn_demo_03.mp3]]&lt;br /&gt;
&lt;br /&gt;
==Delphi Tools==&lt;br /&gt;
&lt;br /&gt;
Um den DAP nutzbar zu machen benötigt man entweder ein uC Programm oder ein PC Programm. Da das verwenden von PC-Programmen einfacher fürs Spielen und Experimentieren ist, werde ich hier im Laufe der Zeit kleine Demo-Programme aber auch komplette Front-Ends für den DAP reinstellen. Die Delphi-Programme sind allesamt in Turbo-Delphi geschrieben und die dazugehörigen Quellcodes werden ebenfalls im Laufe der Zeit geuploaded. Ich werde allerdings zuerst noch das Feature des Konfigurierens der Codecs vom PC aus einbauen. &lt;br /&gt;
Nachtrag zum Konfigurieren des Codecs : Prinzipiell funktioniert es, allerdings ist das mit häßlichen Nebengeräuschen verbunden, da ich bei jeder Änderung der Lautstärke im Codec, diesen auch Resetten muß, da sonst immer beide Codecs beschrieben werden, was unschön ist. Warum dies so ist kann ich leider nicht sagen, da ich keine Möglichkeit habe die SPI-Leitungen mitzusniffen (bräuchte dafür einen kleinen LA, den ich nicht habe). &lt;br /&gt;
&lt;br /&gt;
* Demo eines 3 Band Stereo Equalizers. (Der Knopf &amp;quot;MoveIt!&amp;quot; bringt Leben ins Demo): [[Media:dap_eq_demo.zip]]&lt;br /&gt;
* Demo eines 4 Kanal Mono Mixers mit Monitor (Vorhör)-Ausgang: [[Media:dap_mix_demo.zip]]&lt;br /&gt;
* Demo eines Synthesizer-Filters: [[Media:dap_filter_demo.zip]]&lt;br /&gt;
* Demo eines 2 Kanal Delays (Der Button &amp;quot;MoveIt!&amp;quot; macht daraus einen Chorus :-))): [[Media:dap_delay_demo.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Quellcodes für das EQ-Demo, das Filter-Demo und das Delay-Demo : [[Media:dap_demos_plus_delphi_source.zip]]&lt;br /&gt;
&lt;br /&gt;
Es folgen noch der Quellcode für den Mischer (hab ich gerade nicht zur Hand) und weitere Demos (ein Synthesizer und eine 4x4 Patchbay mit EQ und was mir sonst noch einfällt. Dann natürlich mit Source-Codes).&lt;br /&gt;
Anhand dieser Beispiele wird auch eine grobe Doku erstellt.&lt;br /&gt;
&lt;br /&gt;
== SVN-Repository ==&lt;br /&gt;
&lt;br /&gt;
 svn co svn://mikrocontroller.net/audiodsp&lt;br /&gt;
&lt;br /&gt;
Ein automatisch aktualisiertes Paket mit den Daten aus dem Repository gibt es unter http://www.mikrocontroller.net/download/audiodsp-snapshot.tar.gz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
&lt;br /&gt;
* 12.07.2007: Es wurde ein generisches Speicherinterfaces welches Wartezyklen im DAP erlaubt implementiert. Dadurch kann man auf die jeweilgen Speicher des Boards eingehen. Z.Z. ist nur ein einfaches Speicherinterface für den asynchronen Betrieb des PSDRAM des Nexys Boards implementiert. Das Interface ermögicht es einen RAM Controller anzuschließen welcher z.&amp;amp;nbsp;B. ein quasi-Multiport RAM darstellt. Getestet wurde der Stand mit dem Nexys-1000 Board.&lt;br /&gt;
&lt;br /&gt;
==To do==&lt;br /&gt;
&lt;br /&gt;
* nähere Zukunft&lt;br /&gt;
** Einen Konfigurationsdialog in die Demo-Programme einarbeiten mit denen man mit den Codecs etwas spielen kann (Line-In Level, Mikrofon-Level, Bypass, Head-Phone Volume) tlw. erledigt. Funktioniert aber nicht richtig, und daher noch nicht eingebaut. Quellcodes dazu sind vorhanden.&lt;br /&gt;
** Doku anhand der Demo-Programme erstellen&lt;br /&gt;
** C-Code schnipsel erstellen&lt;br /&gt;
&lt;br /&gt;
* fernere Zukunft&lt;br /&gt;
** Front-End des DAPs machen, mit dem sich DAP-Programme erstellen lassen, der Koeffizienten-, Daten- und Wellenform-Speicher beschrieben und gelesen werden kann, der Mikro-Code editierbar gemacht wird und noch ein paar Sachen mehr machbar sind&lt;br /&gt;
** weitere Module für den Rahmen (HDD-Core, weitere Routing-Möglichkeiten innerhalb der bisherigen Cores SDSP und Util)&lt;br /&gt;
&lt;br /&gt;
==Diskussion==&lt;br /&gt;
* http://www.mikrocontroller.net/topic/65205&lt;br /&gt;
* http://www.mikrocontroller.net/topic/34376&lt;br /&gt;
&lt;br /&gt;
Falls Interesse an einer Sammelbestellung für die Platinen und Bauteile besteht &lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/144288&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]] &lt;br /&gt;
[[Kategorie:Audio]]&lt;br /&gt;
[[Kategorie:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66876</id>
		<title>Audio-DSP mit Spartan 3-FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Audio-DSP_mit_Spartan_3-FPGA&amp;diff=66876"/>
		<updated>2012-06-14T21:27:03Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* Feature-Liste */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von [[Benutzer:TheMason]]&lt;br /&gt;
&lt;br /&gt;
==Ziel==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projekts ist es, eine FPGA-basierte Plattform aufzubauen mit der es möglich ist Synthesizer, Effektgeräte, Mischpulte  oder gar ein Harddiskrecording-System zu realisieren.&lt;br /&gt;
&lt;br /&gt;
==Feature-Liste==&lt;br /&gt;
&lt;br /&gt;
Eigenschaften des Audio-Prozessors: &lt;br /&gt;
&lt;br /&gt;
* Oszillatoren&lt;br /&gt;
* Biquads (Filter)&lt;br /&gt;
* Addierer, Schalter, Verstärker (Multiplizierer)&lt;br /&gt;
* Delays&lt;br /&gt;
* Steuerung des Audio-Prozessors via SPI oder RS232&lt;br /&gt;
* 4 Mono Ein- und Ausgänge&lt;br /&gt;
* GPO (General Purpose Outputs) zur Konfiguration der Codecs&lt;br /&gt;
&lt;br /&gt;
==Übersicht==&lt;br /&gt;
[[Bild:Overview_wo_uc.jpg|thumb|500px]]&lt;br /&gt;
Basis des Audio-Systems ist das Xilinx Spartan 3-Development Board. An diesem Board werden 2 Audio-Codecs angschlossen von denen einer als Master und der andere als Slave agiert. Optional kann noch ein Mikrocontroller angeschlossen werden welcher den FPGA per SPI steuert. Da dieses Projekt mittlerweile recht umfangreich geworden ist, kann ich hier nur einen kurzen Umriss des Systems geben. Dabei beschränke ich mich auf die grobe Funktionsweise des Audio-Prozessors, erläutere das Interface (welches ich als Basis für weitere Projekte bereits nutze) und gebe einen kleinen Überblick über die Hardware.&lt;br /&gt;
&lt;br /&gt;
Das System kann (sofern man 2 Audio-Codecs, von denen einer als Master, der andere als Slave arbeitet, angeschlossen und konfiguriert hat) direkt genutzt werden, da der DAP per RS232 gesteuert werden kann. Der Audio-Prozessor startet mit einem Stereo-Tiefpass-Filter der sich auf den ersten Codec bezieht,&lt;br /&gt;
sodass man ein erstes Demo hat (selbst wenn es etwas unspektakulär ist)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nachbau==&lt;br /&gt;
&lt;br /&gt;
Derjenige der sich dieses System nachbauen möchte benötigt erstmal ein FPGA-Board. Mit dem Spartan 3 Board von Digilent gestaltet sich der Nachbau einfach, weil die Programmier-Dateien für den FPGA direkt für dieses Board verwendet werden können. Nutzer anderer Boards (Xilinx) müssten zuerst die UCF-Datei für die Pins ihres jeweiligen Boards anpassen, und dieses Projekt neu synthetisieren (compilieren). Nutzer von Altera-Boards hingegen müssen die BlockRAM Instanzen auf die Altera-Architektur anpassen (den Inhalt der RAMs dabei nicht vergessen :-). Vielleicht findet sich ja der eine oder andere der den VHDL Code für Altera-FPGAs portiert.&lt;br /&gt;
Der eigentliche wichtige Teil eines Nachbaus ist der Codec-Teil. Dieses System verwendet zwar zwei Codecs, aber es kann auch mit einem gearbeitet werden. Als Codec kommt der TLV320AIC23B von Texas Instruments zum einsatz. Diesen kann man als kostenloses Sample bei TI direkt bekommen. &lt;br /&gt;
Des weiteren benötigt man noch eine handvoll Bauteile wie Kondensatoren, Widerstände und einen Quarz. (Ein Codec MUß als Master laufen, sonst hat das System keine Audio-Clocks, da diese nicht vom FPGA generiert werden)&lt;br /&gt;
Die Initialisierung des Codecs wird vom PC aus gemacht. Dazu dienen die 4 GPO Leitungen auf dem B1- Connector. Da der Codec nur &amp;quot;halbes&amp;quot; SPI unterstüzt (man kann nur schreiben, nicht lesen) gestaltet sich die Initialisierung recht einfach.&lt;br /&gt;
Die 4 GPO-Leitungen teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* Chip-Select Codec 2&lt;br /&gt;
* Chip-Select Codec 1&lt;br /&gt;
* SPI Data Out&lt;br /&gt;
* SPI Clock&lt;br /&gt;
&lt;br /&gt;
==Audio-Prozessor (DAP)==&lt;br /&gt;
&lt;br /&gt;
[[bild:Overview dap core.JPG|thumb|500px|right]]&lt;br /&gt;
&lt;br /&gt;
Der FPGA beinhaltet in dem gesamten System einen Quasi-DSP. Quasi-DSP deshalb, da die Struktur im Gegensatz zu einem DSP bzw. Mikrocontroller keine Verzweigungen, Interrupts oder ähnliches zulässt. Der Audio-Prozessor besteht im wesentlichen aus 3 Teilen : Einem Rahmen, einem SDSP (Small DSP)-Kern &lt;br /&gt;
sowie einem Utility-Kern. Beide Kerne können theoretisch parallel arbeiten, da jeder Kern eine eigene Statemachine und einen eigenen Mikro-Code Speicher besitzen. Dieses Feature ist allerdings noch nicht implementiert.&lt;br /&gt;
&lt;br /&gt;
Der SDSP-Kern besteht im wesentlichen aus einer MAC-Einheit, einem Speicher für Audio-Daten, einem Koeffizienten-Speicher, einem Adress-Generator und mehreren Muxern, sowie der schon angesprochenen Statemachine und dem Microcode. Weiterhin ist ein Hidden-Write- (bzw. Shadow Register) Mechanismus integriert,&lt;br /&gt;
welcher ein &amp;quot;knackser-freies&amp;quot; Updaten von Koeffizienten ermöglicht. Alle diese Komponenten werden vom MicroCode aus gesteuert (genau wie bei einem Mikrocontroller). Mit diesem Kern ist es möglich, Audio-Signale zu bearbeiten. Zu Den Bearbeitungsmöglichkeiten zählen in erster Linie das Verändern der Lautstärke, Mischen, Filtern (Biquad) sowie Laden und Speichern von &lt;br /&gt;
Audio-Werten.&lt;br /&gt;
&lt;br /&gt;
Der Utility Kern besteht aus einem Akkumulator (für DDS), einem Shaper, einem Adress-Generator, einem Wavetable-Speicher, einem Random-Number Generator, einigen Muxern, (einem Adress-Generator für SRAM, einem SRAM-Controller; diese sind allerdings nur nutzbar wenn man das ganze mit dem ISE 6.2 synthetisiert) &lt;br /&gt;
und der schon angesprochenen Statemachine und dem MicroCode. Der MicroCode steuert (genau wie beim SDSP-Kern) dabei die einzelnen Komponenten des Utility Kerns. Dieser kern ist für das Erzeugen von Audio-Signalen zuständig, und erlaubt ein Audio-Signal zu verzögern, sofern man die ISE-Version 6.2 Verwendet (später dazu mehr). Als Wellenformen stehen Sägezahn, Rechteck (mit veränderbarem Puls/Pausen-Verhältnis), Rauschen sowie benutzderdefinierbare Wellenformen (Wavetable) zur verfügung.&lt;br /&gt;
&lt;br /&gt;
Der Rahmen besteht aus einer Statemachine, einem Programm-Speicher, einigen Muxern, sowie einem doppelten I2S Sender-Empfänger (für 2 Stereo Ein- und Ausgänge). In dem Rahmen werden die beiden Kerne &amp;quot;eingehängt&amp;quot;. Die Kerne werden vom Programmspeicher aus mit Daten versorgt, und von der Statemachine angetriggert. Der Programmspeicher (PMEM) ist als 512x32 Bit organisiert. Das heißt das ein Befehl im Programmspeicher 32 Bit Informationen enthält und der &lt;br /&gt;
Audio-Prozessor max. 512 Befehle umfassen kann.&lt;br /&gt;
&lt;br /&gt;
===SDSP-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:SDSP-Struct.jpg|thumb|300px|left|Struktur des SDSP-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Der eigentliche Kern des DAPs ist die MAC-Einheit. Mit ihr werden die grundlegenden Operationen Multiplikation und Addition durchgeführt. Es ist eine 32x32 Bit Einheit. &lt;br /&gt;
Die Funktionsweise des Kerns ist eigentlich recht einfach. &lt;br /&gt;
Die MAC-Einheit hat 2 Eingänge. Einer dieser Eingänge kann ein Audio-Signal, ein Wert aus dem Audio-Speicher (AMEM-BlockRAM) oder ein zuvor berechnetes Ergebnis sein. Der andere Eingang kann ein Koeffizient aus dem CMEM-BlockRAM oder eine Konstante (1.000, 0.000 oder -1.000) sein.&lt;br /&gt;
Der Ausgang (32-Bit, hardgeclippt) geht auf das AMEM-BlockRAM und zum Ausgangs-Clipping. Das Ausgangsclipping schneidet das Audio-Signal auf 24-Bit zurecht.&lt;br /&gt;
Die Adressen für die Speicher (AMEM und CMEM) werden im Address-Generator erzeugt. Dieser wird von außen mit einer 8-bit Basis-Adresse gespeist und erzeugt einen Offset zu den Eingangs Adressen. Er besitzt 2 setzbare Zähler und einige Multiplexer.&lt;br /&gt;
Alle Steuerignale der Komponenten von einem weiteren aus BlockRAM (MMEM) versorgt. Weiterhin wird von außen eine Start-Adresse vorgegeben. Dadurch lassen sich quasi Opcodes mit von außen vorgegeben Parametern (Adressen) aufrufen.&lt;br /&gt;
Das MMEM-BlockRAM wird nun einfach nur linear ausgelesen bis ein Stop-Bit gesetzt ist. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Util-Core===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Util-Core.jpg|thumb|300px|left|Struktur des Utility-Kerns]]&lt;br /&gt;
&lt;br /&gt;
Beschreibung folgt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opcodes des DAP===&lt;br /&gt;
&lt;br /&gt;
Diese 32 Bit eines Befehls teilen sich folgendermaßen auf :&lt;br /&gt;
&lt;br /&gt;
* 4 Bit = Opcode (für SDSP und Utility Kern gleich)&lt;br /&gt;
* 2 Bit = noch leer&lt;br /&gt;
* 1 Bit = Core Select (SDSP oder Utility)&lt;br /&gt;
* 1 Bit = Ende des Programms&lt;br /&gt;
* 4 Bit = Eingangs-Routing (Kanal 1 - 4, Ergebnis SDSP Core, Ergebnis Utility Core)&lt;br /&gt;
* 4 Bit = Ausgangs-Routing (SDSP-Ausgang auf Kanal 1-4, Utility Ausgang auf Kanal 1-4)&lt;br /&gt;
* 8 Bit = Adresse 1 (bei SDSP für Audio-Memory, bei Utility Kern für Data Memory)&lt;br /&gt;
* 8 Bit = Adresse 2 (bei SDSP für Koeffizienten-Memory, bei Utility Kern unbenutzt)&lt;br /&gt;
&lt;br /&gt;
Das Eingangsrouting bestimmt mit welchem Signal der gewählte Kern arbeiten soll. Dies können die Eingänge 1-4 sein, aber auch ein vorher berechnetes Ergebnis des SDSP- bzw. Utility-Kerns sein. Das Ausgangsrouting bestimmt von welchem Kern das Signal auf welchen Ausgang geroutet wird.&lt;br /&gt;
&lt;br /&gt;
Die Opcodes des DAPs sind:&lt;br /&gt;
&lt;br /&gt;
SDSP-Kern:&lt;br /&gt;
* Biquad rechnen&lt;br /&gt;
* Audio Wert speichern&lt;br /&gt;
* Audio Wert laden&lt;br /&gt;
* Move eines Wertes im Audio-Speicher&lt;br /&gt;
* Summe resetten&lt;br /&gt;
* Eingang zu Summe addieren&lt;br /&gt;
* Wert aus dem Audio-Speicher zu Summe addieren&lt;br /&gt;
* Eingang zu summe mischen (mit Lautstärke Koeffizient)&lt;br /&gt;
* wert aus dem Audio-Speicher zu Summe mischen (mit Lautstärke Koeffizient)&lt;br /&gt;
* Lautstärke &lt;br /&gt;
&lt;br /&gt;
Utility-Kern:&lt;br /&gt;
* Oszillator (DDS-Teil)&lt;br /&gt;
* Waveshaper&lt;br /&gt;
* Delay&lt;br /&gt;
&lt;br /&gt;
Der Ablauf eines Audio-Programms ist folgender:&lt;br /&gt;
&lt;br /&gt;
Sobald ein neues Sample anliegt, wird die Abarbeitung des Programms von Adresse 0x0000 an im PMEM angestossen. Es wird dabei jeweils ein Befehl geladen und Daten wie Opcode und Adressen liegen dabei an beide Kernen gleichermaßen an. Ist das Programm-Ende Bit nicht gesetzt so wird der jeweilige Kern (mit dem im Opcode angegeben Routing) angetriggert. Legt der betreffende Kern sein Ready Signal auf 1, so wird der nächste Befehl abgearbeitet. Dieses Verhalten (Laden und Verteilen von Opcode-Daten, sowie die Ablaufsteuerung; also das Antriggern des Programms, Antriggern der einzelnen Kerne, warten auf dessen Abarbeitung und das Programm-Ende) wird vom Rahmen übernommen.&lt;br /&gt;
&lt;br /&gt;
===Speicherorganisation===&lt;br /&gt;
&lt;br /&gt;
Alle Speicher die vom DAP angesprochen werden haben eine Wort-Breite von 32 Bit, der Zugriff erfolgt aber ausschließlich über 8 Bit Breite (Interface).&lt;br /&gt;
&lt;br /&gt;
DAP&lt;br /&gt;
* Programmspeicher 	(PMEM)   0x0000 - 0x07ff&lt;br /&gt;
&lt;br /&gt;
SDSP&lt;br /&gt;
* Audio-Speicher   	(AMEM)   von außen nicht zugänglich&lt;br /&gt;
* Koeffizienten-Speicher 	(CMEM)   0x2000 - 0x2023  (man &amp;quot;sieht&amp;quot; nur den Hidden Write -&amp;gt; später mehr dazu)&lt;br /&gt;
* Microcode-Speicher      (MMEM)   0x4000 - 0x47ff&lt;br /&gt;
&lt;br /&gt;
Utility-Core&lt;br /&gt;
* Daten-Speicher          (DMEM)   0x6000 - 0x67ff&lt;br /&gt;
* Wavetable Speicher      (WMEM)   0x8000 - 0x87ff&lt;br /&gt;
* MicroCode-Speicher      (UMEM)   0xa000 - 0xa7ff&lt;br /&gt;
&lt;br /&gt;
===Hidden-Write===&lt;br /&gt;
Um bei Änderung der Koeffizienten &amp;quot;Knackser&amp;quot; zu vermeiden (die dadurch entstehen das der Koeffizient nur teilweise [durch 8 Bit Zugriffe] geändert wird, währenddessen aber Audio trotzdem noch &amp;quot;weiterläuft&amp;quot;, und mit &amp;quot;falschen&amp;quot; Zwischenwerte gerechnet wird) ist ein Mechanismus implementiert der die zu ändernden Koeffizienten im Hintergund in den Speicher schreibt. Um diesen Mechanismus zu nutzen müssen zuerst die Koeffizienten in interne Register&lt;br /&gt;
geschrieben werden. Die Register (es sind 8 32 Bit Register) liegen im Speicherbereich 0x2000 bis 0x201f. Die Speicherstelle 0x2020 gibt die Start-Adresse innerhalb des Koeffizienten Speichers an. Diese Adresse ist nur 8 Bit breit. Die Speicherstelle 0x2021 gibt an wieviele der 8 Register übertragen werden sollen. Die Speicherstelle 0x2022 triggert den Kopier-Vorgang an. Hier reicht es ein Dummy byte zu schreiben. Um den Kopiervorgang zu beenden (MUß GEMACHT WERDEN!!, sonst können keine weiteren Koeffizienten Updates gemacht werden) schreibt man an Speicherstelle 0x2023 ebenfalls ein Dummy Byte.&lt;br /&gt;
&lt;br /&gt;
===I/O Register===&lt;br /&gt;
&lt;br /&gt;
Es gibt noch einen 8-Bit breiten Adress-Bereich innerhalb des DAPs, mit dem der I2S-Teil gemutet werden kann. Weiterhin hat man die Möglichkeit, die Anzahl der System-Takte pro Sample und die Anzahl der aktiven System-Takte (also die Zeit die der Audio-Prozessor beschäftigt ist) zu ermitteln. Dadurch lässt sich eine Auslastungsanzeige des DAPs realisieren.&lt;br /&gt;
&lt;br /&gt;
===Interface===&lt;br /&gt;
&lt;br /&gt;
Um von außen nun ein Programm (bzw. Koeffizienten und Daten) zu laden ist ein Interface implementiert, welches einfach zu handhaben ist und einfach erweitert werden kann. Das Interface kann per RS232 (fest eingestellt auf 115,2kBaud) oder per SPI (wird Hardware-Mässig eingestellt) angesteuert werden. Das Interface in seiner Gesamtheit ist schichtweise aufgebaut und beginnt mit einem Data-Dispatcher. Dieser Data-Dispatcher entscheidet (nach dem dieser selektiert wurde) mit dem ersten Byte, an welches angeschlossene Gerät der weitere Datenstrom geleitet wird.&lt;br /&gt;
&lt;br /&gt;
Als angeschlossene Geräte sind im aktuellen Design ein Gerät namens &amp;quot;StdIO&amp;quot; und der Audio-Prozessor angeschlossen.&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;StdIO&amp;quot; Gerät steuert die 7Segment-Anzeige (16-Bit Hexadezimal Anzeige oder 32-Bit Einzelsegment Anzeige), die 8 Leuchtdioden, und erlaubt es die 3 Drucktaster sowie die 8 Schiebeschalter auszulesen.&lt;br /&gt;
&lt;br /&gt;
Der Audio-Prozessor besteht (Interface-seitig gesehen) nur aus einem Speicher-Zugriffs-Interface. Dieses Speicher-Interface entscheidet mit dem ersten Byte (sobald es selektiert wurde) ob in den Speicher geschrieben, von diesem gelesen, ein I/O Schreib oder Lese Zugriff erfolgen soll.&lt;br /&gt;
Die Folgenden 2 Bytes (im Falle eines I/O Zugriffs nur 1 Byte) bestimmen die Adresse und damit den Speicher-Bereich des Audio-Prozessors auf den Zugegriffen werden soll. Das Speicherinterface besitzt einen Autoincrement,&lt;br /&gt;
mit dem fortalufende Bytes einfach hintereinander weggeschrieben werden können, ohne das jedesmal wieder der FPGA, das Gerät und die neue Adresse neu geschrieben werden müssen, was den Zugriff erheblich beschleunigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ursprünglich basierte das System auf einem SPI-Interface. Dabei wurde die Chip-Select Leitung als &amp;quot;globaler&amp;quot; Interface Reset betrachtet, d.h. war die Leitung auf High, war der FPGA Deselektiert und und alle Interface-Statemachines wurden im Reset gehalten. Erst mit dem Setzen dieser Leitung wurde der FPGA angesprochen. (erstes Byte -&amp;gt; Daten-Dispatcher, folgende Bytes gehen an das Gerät, wenn eines ausgewählt wurde). Weiterhin hat SPI die Eigenschaft das mit jedem gesendeten Byte auch eines Emfpangen wurde. Der Umstand das RS232 weder eine Chip-Select Leitung benötigt, noch eine synchrone Übertragung erzwingt führt zu dem Umstand das man bei Nutzung von RS232 einige Befehle zusätzlich benötigt. Diese Befehle werden durch das Zeichen 0x1b (ESC) eingeleitet. Soll statt der &amp;quot;Spezial-Funktion&amp;quot; das Byte 0x1b übertragen werden, so wird dieses einfach erneut gesendet. Soll die Chip-Select leitung gesetzt bzw. gelöscht werden so wird die Sequenz 0x1b 0x00 (Selektieren) bzw.&lt;br /&gt;
0x1b 0x01 (Deselektieren) gesendet. Soll ein zuvor im Ausgangsregister gesetztes Byte gesendet werden so muß die Sequenz 0x1b 0x02 gesendet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
0x121b auf dem 7 Segment Display per RS232 Anzeigen:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA Selektieren)&lt;br /&gt;
*- 0xf0      (StdIO Selektieren)&lt;br /&gt;
*- 0x00      (Hi Byte der 7 Segment Hex Anzeige wählen)&lt;br /&gt;
*- 0x12      (Wert 12)&lt;br /&gt;
*- ESC 0x01  (FPGA Deselektieren)&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA Selektieren)&lt;br /&gt;
*- 0xf0      (StdIO Selektieren)&lt;br /&gt;
*- 0x01      (Lo Byte der 7 Segment Hex Anzeige wählen)&lt;br /&gt;
*- 0x1b 0x1b (Wert 1b -&amp;gt; zu beachten: wenn der Wert 0x1b übertragen werden muß, muß dieser doppelt gesendet werden !!)&lt;br /&gt;
*- ESC 0x01  (FPGA Deselektieren)&lt;br /&gt;
&lt;br /&gt;
Beispiel um in den Programmspeicher des Audio-Prozessors an Adresse 0x0010 das Langwort 0x12233445 zu schreiben:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA Selektieren)&lt;br /&gt;
*- 0xf1      (DAP Selektieren)&lt;br /&gt;
*- 0x00      (Speicher Schreiben)&lt;br /&gt;
*- 0x00      &lt;br /&gt;
*- 0x10      (Adresse 0x0010 -&amp;gt; PMEM Adresse 0x010)&lt;br /&gt;
*- 0x12	    (Adresse 0x0010 -&amp;gt; 0x12)	&lt;br /&gt;
*- 0x23	    (Adresse 0x0011 -&amp;gt; 0x23, autoincrement)&lt;br /&gt;
*- 0x34      (Adresse 0x0012 -&amp;gt; 0x34, autoincrement)&lt;br /&gt;
*- 0x45      (Adresse 0x0013 -&amp;gt; 0x45, autoincrement)&lt;br /&gt;
*- ESC 0x01  (FPGA Deselektieren)&lt;br /&gt;
&lt;br /&gt;
Auslesen der 8 Schalter:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA Selektieren)&lt;br /&gt;
*- 0xf0      (StdIO Selektieren)&lt;br /&gt;
*- 0x04      (Schalter auslesen)&lt;br /&gt;
*- 0x00	    (dummy byte -&amp;gt; überträgt Schalter-Stellung in Ausgabe-Register)&lt;br /&gt;
*- ESC 0x02  (Ausgabe Register übertragen, danach empfängt man die 8 Schalterstellungen binär-codiert)&lt;br /&gt;
*- ESC 0x01  (FPGA Deselektieren)&lt;br /&gt;
&lt;br /&gt;
Der Datendispatcher (welcher mit dem ersten Byte nach dem Selektieren des FPGAs [0x1b 0x00] angesprochen wird) hat weiterhin einige nützliche Funktionen die in Ihrer Gesamtheit allerdings noch nicht ausführlich getestet wurden. Darunter sind Funktionen mit denen Inrformationen über die an den Ports des Daten-Dispatchers angeschlossenen Geräte zu ermitteln. Dieses Feature kann dazu genutuzt werden um zu ermitten welche Geräte im FPGA implementiert sind und an welchen Ports welche Geräte angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
Anzahl der Ports des Daten Dispatchers liefern:&lt;br /&gt;
&lt;br /&gt;
*- ESC 0x00  (FPGA Selektieren)&lt;br /&gt;
*- 0xed      (Anzahl Ports lesen)&lt;br /&gt;
*- 0x00      (dummy byte -&amp;gt; überträgt Inhalt des Ausgabe-Registers)&lt;br /&gt;
*- ESC 0x02  (Ausgabe Register übertragen, danach empfängt man 0x22)&lt;br /&gt;
*- ESC 0x01  (FPGA Deselektieren)&lt;br /&gt;
&lt;br /&gt;
===DAP-Modul-Schnipsel===&lt;br /&gt;
&lt;br /&gt;
Um mal &amp;quot;eben&amp;quot; mit dem DAP zu spielen, ein paar Schnipsel die sich recht leicht zu kompletten Funktionsblöcken zusammenschließen lassen.&lt;br /&gt;
Es werden hier nur die RS232 Sequenzen mit einer kurzen Erklärung aufgelistet.&lt;br /&gt;
&lt;br /&gt;
*Dual Mono Biquad&lt;br /&gt;
&lt;br /&gt;
*ESC 0x00 - FPGA Selektieren&lt;br /&gt;
*0xF1     - DAP Auswählen&lt;br /&gt;
*0x00 0x00 0x00 - Memory Write (Adresse 0x0000 -&amp;gt; Program Memory)&lt;br /&gt;
*0x10 0x00 0x00 0x08 - Biquad mit Kanal 1 (0) rechnen (AMEM = 0x00;CMEM = 0x08) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x10 0xf0 0x08 0x10 - Biquad mit vorherigem Ergebnis (0xf) rechnen (AMEM = 0x08; CMEM = 0x10) und auf Kanal 1 (0) ausgeben&lt;br /&gt;
*0x01 0x00 0x00 0x00 - Audio Programm Ende (wichtig !!!)&lt;br /&gt;
*ESC 0x01 - DAP &amp;amp; FPGA deselektieren&lt;br /&gt;
&lt;br /&gt;
Erklärung :&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Opcodes 0x100008 deutet an, das ein Biquad durchgerechnet werden soll. Das Eingangsregister 0 bedeutet das Kanal 1 des 1. Codecs verwendet wird. Das Ausgangsregister welches nach Fertigstellung des Ergebnisses benutzt werden&lt;br /&gt;
ist 0 (-&amp;gt; Kanal 1 des 1. Codecs). Der Teil 0x00 0x08 bedeutet hierbei, das die Biquad-Koeffizienten im CMEM ab Adresse 0x08 stehen. Die Audio-Zwischenwerte werden im Audio-Speicher AMEM ab Adresse 0x00 gelegt.&lt;br /&gt;
Der zweite Opcode (0x10f00810) rechnet ebenfalls ein Biquad durch. Nur das hier statt Kanal 1 des Codecs das voher vom SDSP berechnete Ergebnis verwendet werden soll (Kanal 0xf, wenn man so will). Ausgangsregister ist auch hier wieder Kanal 1. Da dieser Biquad unabhängig vom ersten (d.h. mit anderen Parametern) gerechnet werden soll, sind hier logischerweise auch andere Adressen für AMEM (0x08) und CMEM (0x10) angegeben. Die CMEM-Adresse ist dabei etwas unkritischer, da es ja durchaus sein kann das ein Audio-Signal zweimal mit den selben Biquad-Werten gerechnet werden soll, bzw. unterschiedliche Kanäle mit den selben Biquad-Werten, z.b. bei einem Stereo-Equalizer. Kritischer ist allerdings die Verwendung der AMEM-Adresse. Diese sollte für jede Operation (sofern AMEM denn verwendet wird) unterschiedlich sein, vor allem bei der Berechnung von Biquads. Dies hat den Grund das bei Operationen, die dieselben AMEM Adressen haben die vorher berechneten Werte überschrieben werden. Dies ist bei Biquads gaanz böse (kann u.u. SEHR laut werden), und vom Ergebnis her nicht vorhersagbar.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
[[bild:Fpga_ext_board_schematic_no_uc.JPG|thumb|500px]]&lt;br /&gt;
&lt;br /&gt;
Wie Eingangs erwähnt benötigt das System eine (bzw. zwei) Audio-Codecs. Im aktuellen Schaltplan wird auf einen Mikroprozessor verzichtet. Dieser diente im System erstmal nur zu Initialisierung der Codecs. Dieser Vorgang kann nun vom PC aus gesteuert werden, da in der neuen ISE 6.2 Version 4 Leitungen herausgeführt wurden, welche per RS232 gesetzt und gelöscht werden. &lt;br /&gt;
Wer das System nachbauen möchte kann entweder die TLV320AIC23B Codecs, aber auch beliebige andere Codecs verwenden, solange einer als Master und der andere als Slave arbeitet und beide auf den I2S Modus mit 64FS und 20 Bit Wortlänge eingestellt sind. Die Initialisierung dieser Codecs muß dann aber separat vorgenommen werden (wobei man dann wahrscheinlich nicht um einen uC drum herum kommt). Um das System zu Testen (Programme und Koeffizienten in den DAP einzuspielen) wird lediglich eine serielle Schnittstelle verwendet. Wer will kann aber genausogut den SPI-Modus verwenden und den DAP direkt von einem Mikrocontroller aus steuern. Zur Auswahl der verwendeten Schnittstelle (RS232 oder SPI) wird Pin 13 des B1-Connectors benutzt. Liegt dieser Pin auf GND so wird der FPGA per RS232 gesteuert. Liegt dieser Pin auf 3.3V so wird der FPGA per SPI gesteuert.&lt;br /&gt;
&lt;br /&gt;
Hier der Schaltplan meines verwendeten Audio-Boards.&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier noch die Pin-Belegung des B1-Expansion Connectors:&lt;br /&gt;
&lt;br /&gt;
*01 GND&lt;br /&gt;
*02 VCC 5V&lt;br /&gt;
*03 VCC 3.3V&lt;br /&gt;
*04 N.C.&lt;br /&gt;
*05 SPI_CS - Chip Select (von uC nach FPGA)&lt;br /&gt;
*06 N.C.&lt;br /&gt;
*07 SPI_DI - SPI Data In (von uC nach FPGA)&lt;br /&gt;
*08 BCLK - Bit Clock (von Master Codec)&lt;br /&gt;
*09 SPI_CLK - SPI Clock (von uC nach FPGA)&lt;br /&gt;
*10 LRCLK - LR-Clock (von Master Codec)&lt;br /&gt;
*11 SPI_DO - SPI Data Out (von FPGA nach uC)&lt;br /&gt;
*12 SDOUT1 - zum D/A Wandler (Codec) 1&lt;br /&gt;
*13 IF_SEL - Interface Select (GND = RS232; VCC3.3 = SPI)&lt;br /&gt;
*14 SDIN1 - vom A/D Wandler (Codec) 1&lt;br /&gt;
*15 RXD_OUT - RS232 Signal vom MAX232 zum uC&lt;br /&gt;
*16 SDIN2 - vom A/D Wandler (Codec) 2&lt;br /&gt;
*17 TXD_IN - RS232 Signal vom uC zum MAX232&lt;br /&gt;
*18 SDOUT2 - zum D/A Wandler (Codec) 2&lt;br /&gt;
*19 GPO 3 - Chip-Select Codec 2&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 2 - Chip-Select Codec 1&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 1 - SPI-Data out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
*19 GPO 0 - SPI-Clock Out&lt;br /&gt;
*20 N.C.&lt;br /&gt;
&lt;br /&gt;
==Nexys Board==&lt;br /&gt;
&lt;br /&gt;
Im SVN Repository (s.u.) gibt es eine Version des DAPs für das Nexys Board.&lt;br /&gt;
Diese ist voll SW-Kompatibel zum alten Spartan 3 Board (allerdings z.Z. nur über RS232 steuerbar). Neu bei der Version ist das das Speicherinterface generisch ausgelegt wurde und ein einfacher SRAM-Controller für das Nexys Board PSDRAM geschrieben wurde. Durch das generische Interface ist es möglich andere Speicherarten anzubinden. Der verwendete Codec ist wie schon im bisherigen Projekt der TLV320AIC23B. Dieser wird via RS232 (6-pin Port A des Nexys Boards) über die GPO Leitungen (6-pin Port D des Nexys Boards) initialisiert. Die eigentlichen Datenleitungen des Codecs liegen an Port B (BCLK, LRCLK, DIN, DOUT).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download des DAP als MCS-File für das Nexys-1000 Board : [[Media:Nexys_dap.zip]]&lt;br /&gt;
&lt;br /&gt;
Diese Version ist voll lauffähig (wurde mit den Demos getestet).&lt;br /&gt;
Die Pin Belegung für die RS232 und den Audio-Codec ist wie folgt :&lt;br /&gt;
&lt;br /&gt;
Header A : RS232 Schnittstelle&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Pin 1 : RxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : TxD von MAX232&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : -&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V/5V für MAX232/MAX3232)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header B : I2S Schnittstelle für 1 Codec&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : BitClk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : L/R Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : SDIN&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : SDOUT&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC (3.3V für den Codec)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Header D : Codec-Konfiguration via SPI&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pin 1 : Codec 2 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 2 : Codec 1 CS&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 3 : Codec SPI Data&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 4 : Codec SPI Clk&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 5 : GND&amp;lt;br&amp;gt;&lt;br /&gt;
Pin 6 : VCC&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DAP mit selbstgelötetem FPGA-Board==&lt;br /&gt;
&lt;br /&gt;
Auf einen Beitrag von Thomas Pototschnig hin bin ich auf sein selbstentworfenes Spartan-3-FPGA-Board (Grafikkarte) aufmerksam geworden. Thomas hat mir die Erlaubnis gegeben dieses Board für den DAP verwenden zu können und die Schaltpläne hier zu veröffentlichen. Nachdem ich von ihm noch einige Vorversionen (nur die Platinen) ergattern konnte und diese erfolgreich aufgebaut (mit Spartan 3-200 und -400) habe bin ich von diesem Board echt begeistert. Danke nochmals.&lt;br /&gt;
&lt;br /&gt;
[[Bild:FPGA-Board.jpg|thumb|300px|left]]&lt;br /&gt;
&lt;br /&gt;
Hier der Schaltplan und Layout. &lt;br /&gt;
&lt;br /&gt;
[[Media:miniFPGA-Board.zip]]&lt;br /&gt;
&lt;br /&gt;
Das Board ist 2-seitig und die &amp;quot;schlimmsten&amp;quot; zu lötenden Bauteile sind lediglich der FPGA (QFP-144) und die beiden RAMs (SOJ36, ekelig). Der Rest ist recht einfach. Auch die Inbetriebnahme des Boards gestaltete sich recht einfach.&lt;br /&gt;
&lt;br /&gt;
Den Quellcode für den DAP mußte ich etwas ändern und abspecken. Durch den ineffizienten VHDL-Code der MAC-Einheit gestaltete es sich schwierig das Design synthetisierbar zu machen. Das Synthetisieren auf einem FT256 gestaltete sich einfacher. Hier ist noch Handlungsbedarf in der Form das die MAC-Einheit überarbeitet werden muß. &lt;br /&gt;
Das abgespeckte Design läuft auf dem FPGA-Board mit einem Spartan 3-400 sowie auf einem Spartan 3-200. &lt;br /&gt;
Den Audio-Codec, das FPGA Board, einen AVR und noch etwas IO-Kram habe ich auf eine Lochraster aufgebaut. Was noch fehlt ist ein MIDI und ein SD/MMC-Karten Interface. Dann hat man eine schöne Plattform für Synthesizer und Effektgerät.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anmerkung==&lt;br /&gt;
&lt;br /&gt;
Da wie schon gesagt das Projekt komplett auf meinem &amp;quot;Mist&amp;quot; gewachsen ist wird es wohl noch eine Weile dauern bis alles was den DAP betrifft hier in diesem Artikel (und auch in einem Dokumentations-PDF) eingearbeitet ist. Ich werde (sofern ich Zeit dazu habe) noch ein Delphi Programm mit Source-Code einstellen, welche den DAP richtig nutzbar macht und man dann direkt damit &amp;quot;spielen&amp;quot; kann. Eine umfangreiche und vollständige Dokumentation würde momentan einfach zu viel Zeit in Anspruch nehmen und ich möchte langsam das Projekt Vorstellen um Anregung, Kritik und Verbesserungsvorschläge ernten zu können. Ich hoffe noch Leute zu finden um diesem Projekt noch mehr Leben und Möglichkeiten einhauchen zu können.&lt;br /&gt;
&lt;br /&gt;
==Fotos==&lt;br /&gt;
&lt;br /&gt;
Ursprüngliche Version:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Gesamt_wo_uc.jpg|thumb|200px|left|Spartan3 Board und Expansion Board]]&lt;br /&gt;
[[Bild:Codecs.jpg|thumb|200px|left|Expansion Board]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nexys-Board:&lt;br /&gt;
[[Bild:dap_nexys_v1.jpg|thumb|200px|left|Nexys Board mit 1 Audio-Codec]]&lt;br /&gt;
[[Bild:Nexys-board-gesamt.jpg|thumb|200px|left|Nexys Board mit Lochraster-Board und 2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
[[Bild:Nexys-board-codecs-1.jpg|thumb|200px|left|2 Audio-Codec-Boards (siehe Artikel [[Audio Codec Board]])]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufbau von [[Benutzer:Andreas]]:&lt;br /&gt;
[[Bild:Nexys-Audio-DSP-Foto-Andreas.jpg|thumb|600px|left|Nexys + Breadboard + 1 [[Audio Codec Board]]]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Synth-gesamt-klein.jpg|thumb|500px|left|Aufbau des DAPs mit FPGA-Board (entworfen von Thomas Pototschnig) auf Lochraster an AVR, Codec und weiterer IO]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap-Synth-01.jpg|thumb|300px|left|Synth Board. DAP mit AVR,Codec, MIDI Interface, RS232 (schaltbar) und LCD]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_Ansicht_02.jpg|thumb|300px|left|Synth Board. Komplettansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dap_Synth_klein_3.jpg|thumb|600px|left|Synth Board. Synth-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Oben.jpg|thumb|300px|left|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Mainboard-Unten.jpg|thumb|300px|right|Selbstgeroutetes DAP-Board]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Träger-und-Mainboard.jpg|thumb|600px|left|Selbstgeroutetes DAP-Board auf Trägerplatine]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display-Seite.jpg|thumb|300px|left|DAP-Board mit Touch-Display Seitenansicht]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP mit Touch-Display.jpg|thumb|600px|left|DAP-Board mit Touch-Display]]&lt;br /&gt;
&lt;br /&gt;
Diese Version des DAP hat ein Grafikdisplay incl. Touchpanel. Die Ansteuerung übernimmt der FPGA. Dort ist einer kleiner &amp;quot;Grafik-Prozessor&amp;quot; integriert der das Update des Displays und das Kopieren der Bitmaps übernimmt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synthesizer Ansicht 1.jpg|thumb|600px|left|]]&lt;br /&gt;
Synth-Board. Komplettansicht in einem Cherry-Tastaturgehäuse (wie dafür gemacht :-)) im Synthesizer-Stil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Synth Komplett.jpg|thumb|600px|left|Fertige Version des DAP als Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
Der komplette Synthesizer mit schicker Frontplatte und passendem (oben schon erwähnten :-)) Cherry-Tastatur-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:DAP Version 1.5.jpg|thumb|600px|left|Heue Hardware Version der DAP Hauptplatine]]&lt;br /&gt;
&lt;br /&gt;
Diese Version beinhaltet folgendes : :-) &lt;br /&gt;
&lt;br /&gt;
 - Xilinx XC3S400&lt;br /&gt;
 - ATmega2561&lt;br /&gt;
&lt;br /&gt;
 - 16 MByte (8Mx16) SDRAM&lt;br /&gt;
 - µSD Card Slot&lt;br /&gt;
 - AT45DB321 DataFlash&lt;br /&gt;
 - 24C512 EEProm&lt;br /&gt;
&lt;br /&gt;
 - TLC320AI23B Audio Codec mit Kopfhörer Ausgang&lt;br /&gt;
 - CS5343 A/D Wandler&lt;br /&gt;
 - CS4344 D/A Wandler&lt;br /&gt;
&lt;br /&gt;
 - MIDI&lt;br /&gt;
 - RS232&lt;br /&gt;
 - etlichen IO-Pins vom AVR und FPGA&lt;br /&gt;
 - 2 separaten Clock-Oszillatoren (nicht bestückt)&lt;br /&gt;
&lt;br /&gt;
... und weiterem Kleinkram (LevelShifter, LDO, Platformflash, usw ... und vielen 100nFern)&lt;br /&gt;
&lt;br /&gt;
Ideal zum Aufbau einer Audio-Platform. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audio Demos==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein EQ-Demo mit Rosa Rauschen. Klingt wie eine Meeresbrandung.&lt;br /&gt;
&lt;br /&gt;
[[Media:eq_demo1.zip]]&lt;br /&gt;
&lt;br /&gt;
Der DAP als Synth. Der DAP wird komplett vom PC aus gesteuert (Hüllkurve, Sequencer und Filterberechnung werden im PC gemacht).&lt;br /&gt;
&lt;br /&gt;
[[Media:synthdemo1.wav.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MC505 Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen von meiner Roland-MC505 Groovebox. Es wird einfach nur ein Werkspreset abgespielt und durch den DAP gejagt.&lt;br /&gt;
&lt;br /&gt;
* [[Media:mc505-eq-demo.wav.zip|EQ-Demo]]&lt;br /&gt;
* [[Media:mc505-filter-demo.wav.zip|Filter-Demo (Tiefpass/Hochpass/Notch)]]&lt;br /&gt;
* [[Media:mc505-delay-demo.wav.zip|Delay-Demo (137BPM [657ms &amp;amp; 876 ms]/Chorus)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Synth Board Audio Demos ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Demos stammen vom DAP in Verbindung mit einem AVR der die Filterkoeffizientenberechnung sowie eine komplette Synthesizer-Steuerung beinhaltet, also qausi einen Synthesizer aus dem DAP macht (inkl. MIDI-Steuerung).&lt;br /&gt;
&lt;br /&gt;
MIDI-Sequenz und Tiefpass-Filter (Filter und Modulation über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-01.mp3]]&lt;br /&gt;
&lt;br /&gt;
Diesselbe MIDI-Sequenz mit Hochpass-Filter (Filter und Modulation ebenfalls über MIDI gesteuert) :&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap-syn-demo-02.mp3]]&lt;br /&gt;
&lt;br /&gt;
Ein eher Techno-ähnliches Demo, welches die Auflösung des Systems (DAP+AVR+MIDI) ein wenig zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Media:Dap_syn_demo_03.mp3]]&lt;br /&gt;
&lt;br /&gt;
==Delphi Tools==&lt;br /&gt;
&lt;br /&gt;
Um den DAP nutzbar zu machen benötigt man entweder ein uC Programm oder ein PC Programm. Da das verwenden von PC-Programmen einfacher fürs Spielen und Experimentieren ist, werde ich hier im Laufe der Zeit kleine Demo-Programme aber auch komplette Front-Ends für den DAP reinstellen. Die Delphi-Programme sind allesamt in Turbo-Delphi geschrieben und die dazugehörigen Quellcodes werden ebenfalls im Laufe der Zeit geuploaded. Ich werde allerdings zuerst noch das Feature des Konfigurierens der Codecs vom PC aus einbauen. &lt;br /&gt;
Nachtrag zum Konfigurieren des Codecs : Prinzipiell funktioniert es, allerdings ist das mit häßlichen Nebengeräuschen verbunden, da ich bei jeder Änderung der Lautstärke im Codec, diesen auch Resetten muß, da sonst immer beide Codecs beschrieben werden, was unschön ist. Warum dies so ist kann ich leider nicht sagen, da ich keine Möglichkeit habe die SPI-Leitungen mitzusniffen (bräuchte dafür einen kleinen LA, den ich nicht habe). &lt;br /&gt;
&lt;br /&gt;
* Demo eines 3 Band Stereo Equalizers. (Der Knopf &amp;quot;MoveIt!&amp;quot; bringt Leben ins Demo): [[Media:dap_eq_demo.zip]]&lt;br /&gt;
* Demo eines 4 Kanal Mono Mixers mit Monitor (Vorhör)-Ausgang: [[Media:dap_mix_demo.zip]]&lt;br /&gt;
* Demo eines Synthesizer-Filters: [[Media:dap_filter_demo.zip]]&lt;br /&gt;
* Demo eines 2 Kanal Delays (Der Button &amp;quot;MoveIt!&amp;quot; macht daraus einen Chorus :-))): [[Media:dap_delay_demo.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Quellcodes für das EQ-Demo, das Filter-Demo und das Delay-Demo : [[Media:dap_demos_plus_delphi_source.zip]]&lt;br /&gt;
&lt;br /&gt;
Es folgen noch der Quellcode für den Mischer (hab ich gerade nicht zur Hand) und weitere Demos (ein Synthesizer und eine 4x4 Patchbay mit EQ und was mir sonst noch einfällt. Dann natürlich mit Source-Codes).&lt;br /&gt;
Anhand dieser Beispiele wird auch eine grobe Doku erstellt.&lt;br /&gt;
&lt;br /&gt;
== SVN-Repository ==&lt;br /&gt;
&lt;br /&gt;
 svn co svn://mikrocontroller.net/audiodsp&lt;br /&gt;
&lt;br /&gt;
Ein automatisch aktualisiertes Paket mit den Daten aus dem Repository gibt es unter http://www.mikrocontroller.net/download/audiodsp-snapshot.tar.gz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
&lt;br /&gt;
* 12.07.2007: Es wurde ein generisches Speicherinterfaces welches Wartezyklen im DAP erlaubt implementiert. Dadurch kann man auf die jeweilgen Speicher des Boards eingehen. Z.Z. ist nur ein einfaches Speicherinterface für den asynchronen Betrieb des PSDRAM des Nexys Boards implementiert. Das Interface ermögicht es einen RAM Controller anzuschließen welcher z.&amp;amp;nbsp;B. ein quasi-Multiport RAM darstellt. Getestet wurde der Stand mit dem Nexys-1000 Board.&lt;br /&gt;
&lt;br /&gt;
==To do==&lt;br /&gt;
&lt;br /&gt;
* nähere Zukunft&lt;br /&gt;
** Einen Konfigurationsdialog in die Demo-Programme einarbeiten mit denen man mit den Codecs etwas spielen kann (Line-In Level, Mikrofon-Level, Bypass, Head-Phone Volume) tlw. erledigt. Funktioniert aber nicht richtig, und daher noch nicht eingebaut. Quellcodes dazu sind vorhanden.&lt;br /&gt;
** Doku anhand der Demo-Programme erstellen&lt;br /&gt;
** C-Code schnipsel erstellen&lt;br /&gt;
&lt;br /&gt;
* fernere Zukunft&lt;br /&gt;
** Front-End des DAPs machen, mit dem sich DAP-Programme erstellen lassen, der Koeffizienten-, Daten- und Wellenform-Speicher beschrieben und gelesen werden kann, der Mikro-Code editierbar gemacht wird und noch ein paar Sachen mehr machbar sind&lt;br /&gt;
** weitere Module für den Rahmen (HDD-Core, weitere Routing-Möglichkeiten innerhalb der bisherigen Cores SDSP und Util)&lt;br /&gt;
&lt;br /&gt;
==Diskussion==&lt;br /&gt;
* http://www.mikrocontroller.net/topic/65205&lt;br /&gt;
* http://www.mikrocontroller.net/topic/34376&lt;br /&gt;
&lt;br /&gt;
Falls Interesse an einer Sammelbestellung für die Platinen und Bauteile besteht &lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/144288&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]] &lt;br /&gt;
[[Kategorie:Audio]]&lt;br /&gt;
[[Kategorie:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=66875</id>
		<title>Digitale Signalverarbeitung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=66875"/>
		<updated>2012-06-14T21:26:30Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* dsPIC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Anwendungsgebiete ==&lt;br /&gt;
&lt;br /&gt;
* Modulation/Demodulation zur Datenübertragung (z.&amp;amp;nbsp;B. Telefonmodem, DSL, GSM) - &amp;quot;Software Defined Radio&amp;quot; (SDR)&lt;br /&gt;
* Multimediacodierung (MP3, DivX, JPEG)&lt;br /&gt;
* Bildverarbeitung (Bildverbesserung)&lt;br /&gt;
* Mustererkennung, Objekterkennung&lt;br /&gt;
* Echo- und Störgeräuschunterdrückung bei Telefonen, Sprechgarnituren (Headsets) und Hörgeräten&lt;br /&gt;
&lt;br /&gt;
== Verfahren ==&lt;br /&gt;
&lt;br /&gt;
=== FIR- und IIR-Filter ===&lt;br /&gt;
&lt;br /&gt;
Die häufigste Aufgabe in der DSV ist das Filtern, das heißt, bestimmte Frequenzanteile zu unterdrücken, zu verstärken oder in der Phase zu verschieben. Man kann grundsätzlich zwischen zwei Filterarten unterscheiden:&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;FIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;F&#039;&#039;&#039;inite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) wird jeder Ausgangswert aus der Summe unterschiedlich gewichteter Eingangswerte zusammengesetzt, die dazu in Schieberegistern vorgehalten werden. Dabei bezeichnet man die maximale Anzahl an Werten, die bei der Berechnung berücksichtigt werden, als &#039;&#039;&#039;Ordnung&#039;&#039;&#039; oder auch Filtertiefe. Je höher die Ordnungszahl, desto besser nähern sich die die Eigenschaften des realen Filters bez. ripple, Steilheit und z.B. Dämpfung an das theoretische Ideal an, desto höher ist aber auch der Rechenaufwand.&lt;br /&gt;
&lt;br /&gt;
Werden bei FIR-Filtern nur zurückliegende Werte verwendet, so handelt es sich um ein &amp;quot;look back&amp;quot; - Filter. Dieses ist typisch für real time Anwendungen. Werden auch Werte verwendet, die nach dem eigentlichen Bezugzeitpunkt liegen, spricht man von einem look ahead-Filter. Dieses kann naturgemäß nicht in Echtzeit angewendet werden, bzw die Ausgabezeitpunkte müssen um mindestens die halbe Filtertiefe verzögert werden.&lt;br /&gt;
&lt;br /&gt;
==== Merkmale von FIR-Filtern ====&lt;br /&gt;
* immer stabil&lt;br /&gt;
* linearer Phasengang -&amp;gt; keine Phasenverzerrungen&lt;br /&gt;
* Ordnungen oft im zwei- bis dreistelligen Bereich&lt;br /&gt;
* problemlos realisierbar!&lt;br /&gt;
&lt;br /&gt;
==== Beispiel ====&lt;br /&gt;
Seien D(0), D(1) ... D(t) die eingehenden Daten, so wäre Y(t) = 1/k * (D(t) + D(t-1) + D(t-2) + ... + (t-k)) ein einfaches FIR-Filter der Ordnung &amp;quot;k&amp;quot;, das als gleitender Mittelwert bezeichnet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu FIR-Filtern werden bei &#039;&#039;&#039;IIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;I&#039;&#039;&#039;nfinite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) auch frühere &#039;&#039;&#039;Ausgangs&#039;&#039;&#039;werte in die Berechnung des aktuellen Ausgangswertes mit einbezogen. Wie man sich leicht vorstellen kann, kann dadurch die Antwort auf einen Eingangsimpuls theoretisch unendlich lang werden, da jeder Ausgangswert auf den Eingang rückgekoppelt wird.&lt;br /&gt;
&lt;br /&gt;
====Merkmale von IIR-Filtern====&lt;br /&gt;
* durch Rundungsfehler kann das [[Filter]] instabil werden -&amp;gt; &amp;quot;Aufschaukeln&amp;quot; durch Rückkopplung -&amp;gt; schwierigere Realisierung&lt;br /&gt;
* kein linearer Phasengang -&amp;gt; verschiedene Frequenzanteile werden durch den Filter unterschiedlich lange verzögert -&amp;gt; &amp;quot;Verzerrung&amp;quot;&lt;br /&gt;
* einziger Vorteil gegenüber FIR: Um einen gewünschten Frequenzgang zu erzielen, ist eine sehr viel niedrigere Ordnung ausreichend -&amp;gt; weniger Rechenaufwand&lt;br /&gt;
* Ordnung üblicherweise &amp;lt; 10&lt;br /&gt;
&lt;br /&gt;
==== Beispiel====&lt;br /&gt;
Seien D(0), D(1) ... D(t) wieder die eingehenden Daten, wie oben, und Y(t-1) der um einen Berechungsschritt zeitlich verzögerte Wert des Filterwertes Y(t), dann wäre Y(t) = Y(t-1) * (1-k)  +  D(t) * k ein IIR-Filter erster Ordnung, wobei 1/k die Dämpfung und damit die Grenzfrequenz des Filters bestimmt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Viele nützliche Informationen zur Realisierung gibt es im [http://www.dspguru.com/info/faqs/ FIR- und IIR-FAQ auf dspguru.com] (der dort erwähnte Sourcecode FirAlgs.c kann [[Media:FirAlgs.c|hier]] direkt heruntergeladen werden).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Berechnungssoftware&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.filter-solutions.com/digital.html Beschreibung der Digitalfiltertypen], [http://www.nuhertz.com/download.html hier kostenlose Testversion Filter Free]&lt;br /&gt;
&lt;br /&gt;
=== DFT und FFT ===&lt;br /&gt;
&lt;br /&gt;
Die FFT (Fast Fourier Transform) ist ein schneller Algorithmus zur Berechnung der DFT (Discrete Fourier Transform). Damit bezeichnet man die Transformation eines Zeitsignals (= eine Abfolge von Samples) in den Frequenzbereich (= Frequenzbestandteile des Signals). Die Transformation kann auch ohne Verlust umgekehrt durchgeführt werden, also vom Frequenz- in den Zeitbereich (Inverse Discrete Fourier Transform, IDFT). Eine DFT wird praktisch immer mit dem FFT-Algorithmus realisiert, weshalb die Bezeichnungen FFT/DFT oft gleichwertig verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die offensichtlichste Anwendung der FFT ist die Darstellung des Frequenzspektrums eines Signals. Aber das ist nur ein kleiner Teil der Anwendungsmöglichkeiten. Viele Verarbeitungen lassen sich im Frequenzbereich einfacher durchführen als im Zeitbereich, z.&amp;amp;nbsp;B. Korrelationen oder sehr lange FIR-Filter. Das zu verarbeitende Signal wird dazu in den Frequenzbereich transformiert, dort manipuliert, und wieder in den Zeitbereich zurücktransformiert. Das klingt vielleicht umständlich, kann aber in der Praxis sehr viel schneller sein als eine Realisierung im Zeitbereich.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/25095 Diskussion: FFT auf dem AVR]&lt;br /&gt;
* [http://sourceforge.net/projects/kissfft/ Kiss FFT] - einfache FFT-Bibliothek, in C, Floating- und Fixed Point, BSD-Lizenz, geeignet für Mikrocontroller&lt;br /&gt;
* [http://www.fftw.org/ FFTW] - &#039;&#039;&#039;die&#039;&#039;&#039; Floating Point FFT-Bibliothek für PCs, GPL-Lizenz&lt;br /&gt;
*[http://www.sprut.de/electronic/pic/16bit/dsp/fft/fft.htm FFT - verständlich auch für Nichtakademiker (Deutsch)]&lt;br /&gt;
* [http://www.science.smith.edu/departments/Physics/fstaff/gfelder/ffteasy/ ffteasy - Einfache Routinen zur FFT]&lt;br /&gt;
&lt;br /&gt;
==== Goertzel-Algorithmus ====&lt;br /&gt;
&lt;br /&gt;
Liegt das Interesse bei der Berechnung einer DFT / FFT nur bei wenigen bestimmten Frequenz-Linien, so gibt es eine weniger rechenaufwendige Alternative mit diesem Algorithmus. Die Grenze, ab der Goertzel-Algo nicht mehr effektiv genug ist, liegt grob bei etwa 15% der Spektralfrequenzen.&lt;br /&gt;
&lt;br /&gt;
Das typische Anwendungsgebiet sind DTMF-Dekoder in Software.&lt;br /&gt;
Hierfür sind sogar die üblichen 8-bit-AVR-Controller ausreichend schnell.&lt;br /&gt;
&lt;br /&gt;
=== Signalerzeugung ===&lt;br /&gt;
&lt;br /&gt;
Für die Korrelation von Eingangssignalen mit zuvor ausgesendeten oder bekannten Signalformen zwecks Mustererkennung müssen oftmals eigenen Signale generiert werden.&lt;br /&gt;
&lt;br /&gt;
Rechteck-, Sägezahn- und Dreieckssignale lassen sich mit einfachen Zählern realisieren. &lt;br /&gt;
&lt;br /&gt;
Möchte man Sinus- oder beliebige andere Signalformen erzeugen, bietet es sich an, vorausberechnete Funktionswerte im Speicher abzulegen und der Reihe nach auszugeben. Eine variable Frequenzeinstellung kann man durch die Methode der Direkten Digitalen Synthese (&#039;&#039;&#039;DDS&#039;&#039;&#039;) realisieren.&lt;br /&gt;
&lt;br /&gt;
* [[Digitaler Funktionsgenerator]] - ausführliche Erklärung des Verfahrens im PDF, Beispielcode für AVR&lt;br /&gt;
* http://www.myplace.nu/avr/minidds/ - noch ein AVR-Projekt&lt;br /&gt;
* http://www.hit.bme.hu/~papay/sci/DDS/start.htm - noch eine Erklärung&lt;br /&gt;
&lt;br /&gt;
Eine weitere Methode zur Realisierung von (mehr oder weniger beliebigen) Funktionen ist die &#039;&#039;&#039;Polynomapproximation&#039;&#039;&#039;. Dabei nähert man die zu erzeugende Funktion durch ein Polynom an und verwendet das Horner-Schema, um die einzelnen Funktionswerte zu berechnen. Für ein Polynom der Ordnung N benötigt man damit pro Wert N+1 Multiplikationen (N ist üblicherweise &amp;lt;= 10).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Zur Entwicklung von Signalverarbeitungsverfahren gibt es eine ganze Reihe von Programmen. Neben kleinen Werkzeugen für den Filterentwurf und spezialisierten Bibliotheken zum Einbinden in eigene Programme existieren mehrere Mathematikprogramme, mit denen sich Signale verarbeiten und darstellen lassen. Die drei wichtigsten sind Matlab, Octave und Scilab.&lt;br /&gt;
&lt;br /&gt;
=== MATLAB ===&lt;br /&gt;
&lt;br /&gt;
MATLAB ist das Standardprogramm für numerische Mathematik. In der digitalen Signalverarbeitung wird es häufig verwendet, um einen Algorithmus vor der Umsetzung in C-Code oder auf einen DSP zu entwickeln und zu testen. Zum schon recht hohen Preis der Grundsoftware muss man noch einige hundert Euro für diverse Toolboxes einplanen (Signal Processing, Filter Design, Image Processing). Die [http://www.mikrocontroller.net/link/isbn/0979223903 Studentenversion] kostet ca. 80 Euro (die Signal Processing Toolbox und ein paar andere sind bereits enthalten).&lt;br /&gt;
&lt;br /&gt;
MATLAB ist für Windows, Linux, Mac OS X, Solaris und HP-UX erhältlich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://users.ece.gatech.edu/%7Ebonnie/book/TUTORIAL/tutorial.html - Englischsprachiges MATLAB-Tutorial&lt;br /&gt;
* http://www.mathworks.com/access/helpdesk/help/techdoc/matlab.shtml - MATLAB-Referenz&lt;br /&gt;
* http://www.eng.auburn.edu/~sjreeves/Classes/DSP/DSP.html - MATLAB for DSP (allgemeine Tipps und Hinweise)&lt;br /&gt;
&lt;br /&gt;
=== Octave ===&lt;br /&gt;
&lt;br /&gt;
Das Open-Source-Programm Octave zeichnet sich durch einen hohen Grad an Matlab-Kompatibilität aus; das geht so weit, dass man problemlos die Matlab-Online-Hilfe und Matlab-Einführungen zum Lernen verwenden kann. Im Zusatzpaket Octave-Forge sind auch viele Funktionen der Matlab-Toolboxes enthalten (z.&amp;amp;nbsp;B. Filterdesign, Signalverarbeitung). Octave ist ein reines Kommandozeilenprogramm, so dass man auf alle Annehmlichkeiten der Matlab-GUI verzichten muss. Zum Plotten wird gnuplot verwendet.&lt;br /&gt;
&lt;br /&gt;
Octave lässt sich auf praktisch jedem Unix-System kompilieren. Für Windows gibt es ein fertig kompiliertes Paket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://octave.sourceforge.net/ - Übersicht über alle Funktionen von Octave/Octave-Forge&lt;br /&gt;
&lt;br /&gt;
=== Scilab / Scicos ===&lt;br /&gt;
&lt;br /&gt;
Auch das Open-Source-Programmpaket Scilab / Scicos, ähnlich leistungsfähig wie Matlab und seine Zusatzmodule, ist kostenlos und im Quelltext erhältlich. Während die Grundsyntax (Kontrollstrukturen, Ausdrücke) weitgehend Matlab-kompatibel ist, gibt es bei den Funktionen z.T. deutliche Abweichungen. Dafür bietet Scilab / Scicos verglichen mit Octave umfangreichere Möglichkeiten zur grafischen Darstellung, die über das 2D- und 3D-Plotten von Funktionen weit hinausgehen, z.&amp;amp;nbsp;B. lassen sich Linien, Kreise usw. zeichnen.&lt;br /&gt;
&lt;br /&gt;
Scilab / Scicos läuft unter Windows, Linux/Unix und Mac OS X. Für die wichtigsten Linux-Distributionen sind fertige, komplette Binärpakete (RPM, ...) zur einfachen Installation frei verfügbar. Für Windows gibt es ebenfalls ein einfach zu installierendes Komplettpaket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scilab.org/ Scilab Homepage (Universelles Wissenschaftlich-Technisches Mathematik-Paket)]&lt;br /&gt;
* [http://www.scicos.org/ Scicos Homepage (Modellations- und Simulations-Paket für Scilab, ist im Scilab-Download enthalten)]&lt;br /&gt;
* [http://www-rocq.inria.fr/scicos/scicosmodnum.html ModNum Digital communication toolbox zu Scicos]&lt;br /&gt;
* [http://www.scilab.org/publications/index_publications.php?page=freebooks Übersicht zur Literatur: Webtexte, Bücher und Zeitschriftenartikel]&lt;br /&gt;
&#039;&#039;&#039;Bücher&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scicos.org/book.html Modeling and Simulation in Scilab/Scicos, (für Version 3.0, aktuell ist Version 4.1.2)]&lt;br /&gt;
&#039;&#039;&#039;Tutorials&#039;&#039;&#039;:&lt;br /&gt;
* [http://wiki.scilab.org/Tutorials?action=AttachFile&amp;amp;do=get&amp;amp;target=signal.pdf Signal Processing with Scilab (1998)], [http://wuarchive.wustl.edu/pub/aminet/misc/math/scilab-doc.lha Beispielfiles dazu lha-gepackt (1996)] [http://aminet.net/package/misc/math/scilab-doc oder hier], [http://viewvc.scilab.org/bin/cgi/viewvc.cgi/trunk/scilab_doc/signal/Nfigs_source/ hier auch einzeln erhältlich]&lt;br /&gt;
* [http://www.scilab.org/publications/delicado/scilab.pdf DSP-Tutorial in spanisch, teilweise aus dem englischen Tutorial entnommen]&lt;br /&gt;
* [http://www.neurotraces.com/scilab/scilab2/index.html Treatment of neurophysiological signals using Scilab, HTML-Texte mit Kapiteln zu Filtern, FFT usw.]&lt;br /&gt;
* [http://www.scilab.org/publications/TELECOM/ComNumSc.zip Digital-Kommunikation - französisches Tutorial, gezipptes Postscript]&lt;br /&gt;
* [http://www.mate.tue.nl/mate/pdfs/6827.pdf Beispielprojekt mit Vergleich SciCos und SciLab]&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ein DSP (&#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ignal &#039;&#039;&#039;P&#039;&#039;&#039;rocessor) ist eine spezielle CPU mit einem auf die Verarbeitung von Signalen optimierten Kern und Befehlssatz. Unterschieden wird hauptsächlich zwischen Gleitkomma- und Festkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
Charakteristisches Merkmal vieler DSPs ist eine VLIW-Architektur (&#039;&#039;&#039;V&#039;&#039;&#039;ery &#039;&#039;&#039;L&#039;&#039;&#039;ong &#039;&#039;&#039;I&#039;&#039;&#039;nstruction &#039;&#039;&#039;W&#039;&#039;&#039;ord). Dabei werden Anweisungen für mehrere parallele Ausführungseinheiten (Multiplizierer/Addierer/Akkumulatoren) und mehrere Lade-/Speicherbefehle in einem einzigen, langen Befehlswort kodiert, und in einem Takt ausgeführt. Dazu kommen häufig mehrere gleichzeitig adressierbare Speicherbänke, Unterstützung für Ringpuffer, Schleifen ohne Sprung-Overhead, Bit-Reverse-Adressierung (wichtig für FFT) und Arithmetik mit Sättigungs- statt Überlaufverhalten (wichtig für die Realisierung von IIR-Filtern).&lt;br /&gt;
&lt;br /&gt;
Seit ein paar Jahren beginnen die Grenzen zwischen Mikrocontrollern und DSPs etwas zu verschwimmen. Viele Mikrocontroller werden mit zusätzlichen DSP-Funktionen ausgestattet ([[PICCOLO]], [[dsPIC]], [[ARM]]), während DSPs zunehmend in Richtung der Aufgabenbereiche eines Mikrocontrollers oder Allround-Prozessors vordringen und immer öfter um Unterstützung für Betriebssysteme (MMU) oder I/O-Funktionen wie Ethernet oder USB erweitert werden ([[Blackfin]]).&lt;br /&gt;
&lt;br /&gt;
Eine noch größere DSP-Rechenleistung kann mit programmierbaren Logikbausteinen (&#039;&#039;&#039;[[FPGA]]&#039;&#039;&#039;s) erzielt werden, da die Anzahl gleichzeitig ausführbarer Rechenoperationen nur durch die Größe des FPGAs begrenzt wird. Nachteilig sind die gegenüber DSPs um ein vielfaches höheren Kosten, höherer Stromverbrauch und höherer Entwicklungsaufwand, weshalb FPGAs für Signalverarbeitung nur in sehr speziellen Anwendungen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aktuelle &#039;&#039;&#039;PC-Prozessoren&#039;&#039;&#039; sind sehr gut für Gleitkomma-Signalverarbeitung geeignet. Wenn keine besonderen Anforderungen an Echtzeitfähigkeit, Strom- oder Platzbedarf gestellt werden, hat ein normaler PC mit Abstand das beste Preis/Leistungsverhältnis. Der erste Schritt bei einem DSP-Projekt sollte somit eine Implementierung auf dem PC sein. Es macht wenig Sinn, ein Eval-Board für einen Signalprozessor zu kaufen und einfach loszulegen.&lt;br /&gt;
&lt;br /&gt;
=== Fest- oder Gleitkomma? ===&lt;br /&gt;
&lt;br /&gt;
Signalverarbeitung auf einem Gleitkomma- (Floating-Point-) Rechner ist grundsätzlich einfacher als auf einem Festkomma- (Fixed-Point-) Rechner. Da die Ungenauigkeiten bei der Rechnung mit Floating-Point-Zahlen in vielen Fällen vernachlässigbar sind, kann man einen Algorithmus i.d.R. 1:1 in Programmcode umsetzen. Hat man nur Festkomma-Rechenoperationen zur Verfügung wird es etwas ungemütlich. Man muss sich Gedanken um die Skalierung der Daten, die Reihenfolge von Rechenoperationen, Überläufe, Rundungsrauschen usw. machen. Da Gleitkomma-DSPs allerdings teurer sind und mehr Strom verbrauchen, werden für Massenprodukte fast ausschließlich Festkomma-DSPs bzw. ASICs mit Festkomma-Rechenwerken verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TI C2000 ===&lt;br /&gt;
&lt;br /&gt;
Eine komplette 32-bit DSC Controller Familie vom low-cost ([http://www.ti.com/corp/docs/landing/f280xx-piccolo/index.htm PICCOLO]) bis high-end Controller mit FPU ([http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=mcu&amp;amp;sectionId=95&amp;amp;tabId=2108&amp;amp;familyId=1414&amp;amp;paramCriteria=no TMS320F28335]).&lt;br /&gt;
Die Peripherie umfasst Mehrkanal A/D Wandler mit 12-bit Aufloesung und bis zu 4 Megasamples Abtastrate. Die PWMs haben einen hochauflösenden Modus, der bis zu 150ps auflösen kann. Als Interface stehen CAN, I2C, schnelle generelle serielle Ports und Quadratureingänge für Drehgeber zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== TI C5000 ===&lt;br /&gt;
&lt;br /&gt;
DSP für batteriebetriebene Anwendungen. Die gesamte Architektur wurde auf Stromverbrauch optimiert. Dazu werden spezielle Werkzeuge zur Verfügung gestellt, die zur Anwendung passende Optimierungslösungen generiert. [[TMS320VC5505 eZDSP USB Stick‎]] mit IDE als preisgünstiges Entwicklungssystem ( &amp;lt; 50€)&lt;br /&gt;
&lt;br /&gt;
=== TI C6000 ===&lt;br /&gt;
&lt;br /&gt;
DSP-Familie vom Marktführer Texas Instruments enthält sowohl Fest- als auch Gleitkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
=== TI DM6400 (DaVinci) ===&lt;br /&gt;
&lt;br /&gt;
DSP für Videoanwendungen. Einige Derivate enthalten auch einen ARM9 als Co-Prozessor. Diese Familie wird unter dem Namen [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=dsp&amp;amp;sectionId=2&amp;amp;tabId=1852&amp;amp;familyId=1300 DaVinci] vermarktet.&lt;br /&gt;
&lt;br /&gt;
=== TI OMAP ===&lt;br /&gt;
&lt;br /&gt;
Prozessor für mobile Geräte, enthält einen ARM-Kern und einen C6000-DSP. Ein interessantes und mit $149 sehr preisgünstiges Evalboard ist das [http://www.beagleboard.org Beagle Board]. Ein kostenloser Assembler für den DSP ist verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== SHARC/TigerSHARC ===&lt;br /&gt;
&lt;br /&gt;
32-Bit-Gleitkomma-DSP von Analog Devices.&lt;br /&gt;
&lt;br /&gt;
=== Blackfin ===&lt;br /&gt;
&lt;br /&gt;
Der Blackfin ist ein 16/32-Bit-Festkomma-DSP von Analog Devices. Im Gegensatz zu den 16-bittigen Vorgängern ADSP-21xx, die häufig als Co-Prozessoren zur Signalverarbeitung zusammen mit einem Mikrocontroller verwendet werden, geht der Blackfin schon weit in den Einsatzbereich eines Allround-Prozessors hinein. So gibt es z.&amp;amp;nbsp;B. einen Linux-Port für Blackfin, Eval-Boards mit Ethernet, CAN, USB und vielen MB SDRAM. Dank der verbesserten Stromsparfunktionen der BF52x-Reihe ist diese eher neue Architektur vermehrt in mobilen Geräten (Kameras, Mediaplayer, etc.) anzutreffen.&lt;br /&gt;
&lt;br /&gt;
Wichtig für die Entwicklung ist zu wissen:&lt;br /&gt;
&lt;br /&gt;
* Keine Fließkomma-Unterstützung in Hardware&lt;br /&gt;
* Keine MMU, keine Unterstützung für virtuellen Speicher (kein Unix fork(), etc.)&lt;br /&gt;
&lt;br /&gt;
Unterstützte Entwicklungswerkzeuge:&lt;br /&gt;
&lt;br /&gt;
* Visual DSP++: Hauseigenes Entwicklungswerkzeug von Analog Devices, kommerziell&lt;br /&gt;
* GCC: Freie GNU-Umgebung mit Assembler, Compiler, Linker, Debugger&lt;br /&gt;
* Eclipse für uClinux-Entwicklung wie auch &#039;nackt&#039; ohne OS&lt;br /&gt;
&lt;br /&gt;
Aufgrund der ausgereiften GNU-Toolchain ist der Blackfin eine der kostengünstigsten Plattformen für die Entwicklung. Die Werkzeuge laufen sowohl unter Windows32 als auch Linux, bevorzugt wird jedoch Linux eingesetzt. Für die Kernel-Entwicklung ist Linux unabdingbar.&lt;br /&gt;
Dank offener JTAG-Spezifikation existieren einige Werkzeuge von Drittherstellern zum Hardware-Debugging (In-Circuit Emulation) und zur Programmierung:&lt;br /&gt;
&lt;br /&gt;
* [http://www.section5.ch/icebear ICEbear] JTAG: schneller USB-&amp;gt;JTAG adapter&lt;br /&gt;
* [http://www.ronetix.at/ PEEDI] High end JTAG, Ethernet&lt;br /&gt;
* [http://www.bluetechnix.at/rainbow2006/site/blackfin_family/__dev_tools/__gnice_jtag/409/gnice_jtag.aspx gnICE von Bluetechnix]&lt;br /&gt;
* [http://www.analog.com/en/processors-dsp/blackfin/emulator-100/processors/product.html JTAG-Adapter von Analog Devices]&lt;br /&gt;
&lt;br /&gt;
Beide Werkzeuge arbeiten auch mit ARM-Prozessoren.&lt;br /&gt;
&lt;br /&gt;
Weitere Links:&lt;br /&gt;
&lt;br /&gt;
* [http://www.bluetechnix.com/rainbow2006/default.aspx Bluetechnix Core-Module]&lt;br /&gt;
* [http://www.analog.com/blackfin Herstellerwebsite]&lt;br /&gt;
* [http://blackfin.uclinux.org/ uClinux Port und GNU toolchain]&lt;br /&gt;
&lt;br /&gt;
=== dsPIC ===&lt;br /&gt;
&lt;br /&gt;
Der [[dsPIC]] ist ein kleiner 16-Bit-Mikrocontroller mit DSP-Funktionen. Mit dem klassischen 8-Bit-PIC hat er außer dem Namen nichts gemeinsam.&lt;br /&gt;
&lt;br /&gt;
Er basiert auf der modernen RISC-Architektur des PIC24 und bietet zusätzlich 40-Bit-Register und spezielle Befehle für DSP-Anwendungen. Der derzeit schnellste dsPIC33E arbeitet mit bis zu 70MIPS. dsPIC33 gibt es auch im DIL28-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
Ein kostenloser C-Compiler (C30) und eine DSP-Bibliothek werden von Microchip angeboten. Dabei handelt es sich um eine &amp;quot;Light&amp;quot;-Version des kommerziellen C30, bei dem nur eine Optimierungsstufe freigeschaltet ist, aber ansonsten keine Einschränkungen (Codegröße o.ä.) bestehen.&lt;br /&gt;
&lt;br /&gt;
=== TriCore ===&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;TriCore&#039;&#039;&#039; von Infineon ist ein 32-Bit-Mikrocontroller mit DSP-Funktionen, mit derzeitigem Schwerpunkt im Bereich der High Performance Embedded Real-Time Systems für Industrie-  und Automobilanwendungen (Beispiele: Motorsteuerungen, Servomotoren, Solarinverter, Multi-Axis-Conrol) &lt;br /&gt;
&lt;br /&gt;
* [http://www.infineon.com/cgi-bin/ifx/portal/ep/channelView.do?channelId=-78991&amp;amp;channelPage=%2Fep%2Fchannel%2FleafNote.jsp&amp;amp;pageTypeId=17099  Übersicht über die &#039;&#039;&#039;TriCore&#039;&#039;&#039; Produktfamilie]&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen für Starterkits/Evalboards ===&lt;br /&gt;
&lt;br /&gt;
* http://www.spectrumdigital.com - große Auswahl an Starterkits mit TI-DSPs, ab $300&lt;br /&gt;
* http://www.bluetechnix.com - Blackfin-Module ab € 150&lt;br /&gt;
* http://www.zbrain.ch/ - Blackfin-Modul, Preis: ?&lt;br /&gt;
* http://www.danvillesignal.com/ - ADSP-218x-Boards ab $200, Sharc-Boards ab $400&lt;br /&gt;
* http://docs.blackfin.uclinux.org/doku.php?id=buy_stuff - Blackfin BF533 STAMP $170 (keine analogen Schnittstellen, aber über Pfostenstecker leicht zu erweitern)&lt;br /&gt;
* http://www.sundance.com - High-End-Module mit TI C6000&lt;br /&gt;
* http://www.spectrumsignal.com/ - TMS320 und SHARC&lt;br /&gt;
* http://www.pentek.com/dspcentral/ - TMS430 und PowerPC&lt;br /&gt;
* http://www.bittware.com/ - SHARC und TigerSHARC&lt;br /&gt;
* http://www.hunteng.co.uk/ - C6000&lt;br /&gt;
* http://www.kanecomputing.co.uk&lt;br /&gt;
* http://www.dsp-systeme.net - DSP-Module mit DSP von TI und ADI&lt;br /&gt;
* http://search.digikey.com/scripts/DkSearch/dksus.dll?lang=de&amp;amp;site=DE&amp;amp;WT.z_homepage_link=hp_go_button&amp;amp;KeyWords=TMDX5505EZDSP&amp;amp;x=22&amp;amp;y=22  eZDSP  USB Stick , &amp;lt;50€&lt;br /&gt;
* http://www.dsp-weuffen.de  - TI C6727 Board und vielen Beispielen&lt;br /&gt;
* http://www.ehitex.de/artikel.php?xPD=131_132&amp;amp;kat_name= - Infineon TriCore Starter Kits&lt;br /&gt;
&lt;br /&gt;
== Weitere Infos==&lt;br /&gt;
&lt;br /&gt;
===Literatur ===&lt;br /&gt;
* Oppenheim, Schaefer: &amp;quot;Discrete Time Signal Processing&amp;quot;, ISBN 0131988425&lt;br /&gt;
* Proakis: &amp;quot;Digital Signal Processing&amp;quot;, ISBN 0131873741&lt;br /&gt;
* Lyons: &amp;quot;Understanding Digital Signal Processing&amp;quot;, ISBN 0131089897&lt;br /&gt;
* Smith: &amp;quot;The Scientist and Engineer&#039;s Guide to Digital Signal Processing&amp;quot;, ISBN  075067444X (unter http://dspguide.com/ als PDF verfügbar)&lt;br /&gt;
* Sanjit K. Mitra: &amp;quot;Handbook for Digital Signal Processing&amp;quot; (1993,1312 Seiten), ISBN 0471619957&lt;br /&gt;
&lt;br /&gt;
=== Foren ===&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-10-1.html DSP-Forum auf mikrocontroller.net (deutsch)]&lt;br /&gt;
* [http://groups.google.de/group/comp.dsp Newsgroup comp.dsp (Englisch)]&lt;br /&gt;
* [http://www.dsprelated.com/groups.php Discussion Groups (Englisch)]&lt;br /&gt;
&lt;br /&gt;
=== Webseiten ===&lt;br /&gt;
* http://www.dspguru.com/ - FAQs, Infos, Beispielcode, ...&lt;br /&gt;
* http://docs.google.com/View?docid=dg2hppb_4gtgk89 - evtl. interessant als Rohmaterial für diesen Artikel&lt;br /&gt;
* http://www.dsprelated.com - Blogs, Jobs, Comp.DSP, ...&lt;br /&gt;
* http://www.unidsp56.de/ Eine Entwicklungsplattform für den Amateur&lt;br /&gt;
* http://de.wikipedia.org/wiki/Datei:Aircraft-recognition-and-tracking-by-dsp-based-signal-processing.jpg&lt;br /&gt;
&lt;br /&gt;
=== Artikel aus der Kategorie DSP ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ncl style=compact maxdepth=2 headings=bullet headstart=2&lt;br /&gt;
      showcats=1 showarts=1&amp;gt;DSP&amp;lt;/ncl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=66874</id>
		<title>Digitale Signalverarbeitung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=66874"/>
		<updated>2012-06-14T21:25:38Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* Blackfin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Anwendungsgebiete ==&lt;br /&gt;
&lt;br /&gt;
* Modulation/Demodulation zur Datenübertragung (z.&amp;amp;nbsp;B. Telefonmodem, DSL, GSM) - &amp;quot;Software Defined Radio&amp;quot; (SDR)&lt;br /&gt;
* Multimediacodierung (MP3, DivX, JPEG)&lt;br /&gt;
* Bildverarbeitung (Bildverbesserung)&lt;br /&gt;
* Mustererkennung, Objekterkennung&lt;br /&gt;
* Echo- und Störgeräuschunterdrückung bei Telefonen, Sprechgarnituren (Headsets) und Hörgeräten&lt;br /&gt;
&lt;br /&gt;
== Verfahren ==&lt;br /&gt;
&lt;br /&gt;
=== FIR- und IIR-Filter ===&lt;br /&gt;
&lt;br /&gt;
Die häufigste Aufgabe in der DSV ist das Filtern, das heißt, bestimmte Frequenzanteile zu unterdrücken, zu verstärken oder in der Phase zu verschieben. Man kann grundsätzlich zwischen zwei Filterarten unterscheiden:&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;FIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;F&#039;&#039;&#039;inite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) wird jeder Ausgangswert aus der Summe unterschiedlich gewichteter Eingangswerte zusammengesetzt, die dazu in Schieberegistern vorgehalten werden. Dabei bezeichnet man die maximale Anzahl an Werten, die bei der Berechnung berücksichtigt werden, als &#039;&#039;&#039;Ordnung&#039;&#039;&#039; oder auch Filtertiefe. Je höher die Ordnungszahl, desto besser nähern sich die die Eigenschaften des realen Filters bez. ripple, Steilheit und z.B. Dämpfung an das theoretische Ideal an, desto höher ist aber auch der Rechenaufwand.&lt;br /&gt;
&lt;br /&gt;
Werden bei FIR-Filtern nur zurückliegende Werte verwendet, so handelt es sich um ein &amp;quot;look back&amp;quot; - Filter. Dieses ist typisch für real time Anwendungen. Werden auch Werte verwendet, die nach dem eigentlichen Bezugzeitpunkt liegen, spricht man von einem look ahead-Filter. Dieses kann naturgemäß nicht in Echtzeit angewendet werden, bzw die Ausgabezeitpunkte müssen um mindestens die halbe Filtertiefe verzögert werden.&lt;br /&gt;
&lt;br /&gt;
==== Merkmale von FIR-Filtern ====&lt;br /&gt;
* immer stabil&lt;br /&gt;
* linearer Phasengang -&amp;gt; keine Phasenverzerrungen&lt;br /&gt;
* Ordnungen oft im zwei- bis dreistelligen Bereich&lt;br /&gt;
* problemlos realisierbar!&lt;br /&gt;
&lt;br /&gt;
==== Beispiel ====&lt;br /&gt;
Seien D(0), D(1) ... D(t) die eingehenden Daten, so wäre Y(t) = 1/k * (D(t) + D(t-1) + D(t-2) + ... + (t-k)) ein einfaches FIR-Filter der Ordnung &amp;quot;k&amp;quot;, das als gleitender Mittelwert bezeichnet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu FIR-Filtern werden bei &#039;&#039;&#039;IIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;I&#039;&#039;&#039;nfinite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) auch frühere &#039;&#039;&#039;Ausgangs&#039;&#039;&#039;werte in die Berechnung des aktuellen Ausgangswertes mit einbezogen. Wie man sich leicht vorstellen kann, kann dadurch die Antwort auf einen Eingangsimpuls theoretisch unendlich lang werden, da jeder Ausgangswert auf den Eingang rückgekoppelt wird.&lt;br /&gt;
&lt;br /&gt;
====Merkmale von IIR-Filtern====&lt;br /&gt;
* durch Rundungsfehler kann das [[Filter]] instabil werden -&amp;gt; &amp;quot;Aufschaukeln&amp;quot; durch Rückkopplung -&amp;gt; schwierigere Realisierung&lt;br /&gt;
* kein linearer Phasengang -&amp;gt; verschiedene Frequenzanteile werden durch den Filter unterschiedlich lange verzögert -&amp;gt; &amp;quot;Verzerrung&amp;quot;&lt;br /&gt;
* einziger Vorteil gegenüber FIR: Um einen gewünschten Frequenzgang zu erzielen, ist eine sehr viel niedrigere Ordnung ausreichend -&amp;gt; weniger Rechenaufwand&lt;br /&gt;
* Ordnung üblicherweise &amp;lt; 10&lt;br /&gt;
&lt;br /&gt;
==== Beispiel====&lt;br /&gt;
Seien D(0), D(1) ... D(t) wieder die eingehenden Daten, wie oben, und Y(t-1) der um einen Berechungsschritt zeitlich verzögerte Wert des Filterwertes Y(t), dann wäre Y(t) = Y(t-1) * (1-k)  +  D(t) * k ein IIR-Filter erster Ordnung, wobei 1/k die Dämpfung und damit die Grenzfrequenz des Filters bestimmt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Viele nützliche Informationen zur Realisierung gibt es im [http://www.dspguru.com/info/faqs/ FIR- und IIR-FAQ auf dspguru.com] (der dort erwähnte Sourcecode FirAlgs.c kann [[Media:FirAlgs.c|hier]] direkt heruntergeladen werden).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Berechnungssoftware&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.filter-solutions.com/digital.html Beschreibung der Digitalfiltertypen], [http://www.nuhertz.com/download.html hier kostenlose Testversion Filter Free]&lt;br /&gt;
&lt;br /&gt;
=== DFT und FFT ===&lt;br /&gt;
&lt;br /&gt;
Die FFT (Fast Fourier Transform) ist ein schneller Algorithmus zur Berechnung der DFT (Discrete Fourier Transform). Damit bezeichnet man die Transformation eines Zeitsignals (= eine Abfolge von Samples) in den Frequenzbereich (= Frequenzbestandteile des Signals). Die Transformation kann auch ohne Verlust umgekehrt durchgeführt werden, also vom Frequenz- in den Zeitbereich (Inverse Discrete Fourier Transform, IDFT). Eine DFT wird praktisch immer mit dem FFT-Algorithmus realisiert, weshalb die Bezeichnungen FFT/DFT oft gleichwertig verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die offensichtlichste Anwendung der FFT ist die Darstellung des Frequenzspektrums eines Signals. Aber das ist nur ein kleiner Teil der Anwendungsmöglichkeiten. Viele Verarbeitungen lassen sich im Frequenzbereich einfacher durchführen als im Zeitbereich, z.&amp;amp;nbsp;B. Korrelationen oder sehr lange FIR-Filter. Das zu verarbeitende Signal wird dazu in den Frequenzbereich transformiert, dort manipuliert, und wieder in den Zeitbereich zurücktransformiert. Das klingt vielleicht umständlich, kann aber in der Praxis sehr viel schneller sein als eine Realisierung im Zeitbereich.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/25095 Diskussion: FFT auf dem AVR]&lt;br /&gt;
* [http://sourceforge.net/projects/kissfft/ Kiss FFT] - einfache FFT-Bibliothek, in C, Floating- und Fixed Point, BSD-Lizenz, geeignet für Mikrocontroller&lt;br /&gt;
* [http://www.fftw.org/ FFTW] - &#039;&#039;&#039;die&#039;&#039;&#039; Floating Point FFT-Bibliothek für PCs, GPL-Lizenz&lt;br /&gt;
*[http://www.sprut.de/electronic/pic/16bit/dsp/fft/fft.htm FFT - verständlich auch für Nichtakademiker (Deutsch)]&lt;br /&gt;
* [http://www.science.smith.edu/departments/Physics/fstaff/gfelder/ffteasy/ ffteasy - Einfache Routinen zur FFT]&lt;br /&gt;
&lt;br /&gt;
==== Goertzel-Algorithmus ====&lt;br /&gt;
&lt;br /&gt;
Liegt das Interesse bei der Berechnung einer DFT / FFT nur bei wenigen bestimmten Frequenz-Linien, so gibt es eine weniger rechenaufwendige Alternative mit diesem Algorithmus. Die Grenze, ab der Goertzel-Algo nicht mehr effektiv genug ist, liegt grob bei etwa 15% der Spektralfrequenzen.&lt;br /&gt;
&lt;br /&gt;
Das typische Anwendungsgebiet sind DTMF-Dekoder in Software.&lt;br /&gt;
Hierfür sind sogar die üblichen 8-bit-AVR-Controller ausreichend schnell.&lt;br /&gt;
&lt;br /&gt;
=== Signalerzeugung ===&lt;br /&gt;
&lt;br /&gt;
Für die Korrelation von Eingangssignalen mit zuvor ausgesendeten oder bekannten Signalformen zwecks Mustererkennung müssen oftmals eigenen Signale generiert werden.&lt;br /&gt;
&lt;br /&gt;
Rechteck-, Sägezahn- und Dreieckssignale lassen sich mit einfachen Zählern realisieren. &lt;br /&gt;
&lt;br /&gt;
Möchte man Sinus- oder beliebige andere Signalformen erzeugen, bietet es sich an, vorausberechnete Funktionswerte im Speicher abzulegen und der Reihe nach auszugeben. Eine variable Frequenzeinstellung kann man durch die Methode der Direkten Digitalen Synthese (&#039;&#039;&#039;DDS&#039;&#039;&#039;) realisieren.&lt;br /&gt;
&lt;br /&gt;
* [[Digitaler Funktionsgenerator]] - ausführliche Erklärung des Verfahrens im PDF, Beispielcode für AVR&lt;br /&gt;
* http://www.myplace.nu/avr/minidds/ - noch ein AVR-Projekt&lt;br /&gt;
* http://www.hit.bme.hu/~papay/sci/DDS/start.htm - noch eine Erklärung&lt;br /&gt;
&lt;br /&gt;
Eine weitere Methode zur Realisierung von (mehr oder weniger beliebigen) Funktionen ist die &#039;&#039;&#039;Polynomapproximation&#039;&#039;&#039;. Dabei nähert man die zu erzeugende Funktion durch ein Polynom an und verwendet das Horner-Schema, um die einzelnen Funktionswerte zu berechnen. Für ein Polynom der Ordnung N benötigt man damit pro Wert N+1 Multiplikationen (N ist üblicherweise &amp;lt;= 10).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Zur Entwicklung von Signalverarbeitungsverfahren gibt es eine ganze Reihe von Programmen. Neben kleinen Werkzeugen für den Filterentwurf und spezialisierten Bibliotheken zum Einbinden in eigene Programme existieren mehrere Mathematikprogramme, mit denen sich Signale verarbeiten und darstellen lassen. Die drei wichtigsten sind Matlab, Octave und Scilab.&lt;br /&gt;
&lt;br /&gt;
=== MATLAB ===&lt;br /&gt;
&lt;br /&gt;
MATLAB ist das Standardprogramm für numerische Mathematik. In der digitalen Signalverarbeitung wird es häufig verwendet, um einen Algorithmus vor der Umsetzung in C-Code oder auf einen DSP zu entwickeln und zu testen. Zum schon recht hohen Preis der Grundsoftware muss man noch einige hundert Euro für diverse Toolboxes einplanen (Signal Processing, Filter Design, Image Processing). Die [http://www.mikrocontroller.net/link/isbn/0979223903 Studentenversion] kostet ca. 80 Euro (die Signal Processing Toolbox und ein paar andere sind bereits enthalten).&lt;br /&gt;
&lt;br /&gt;
MATLAB ist für Windows, Linux, Mac OS X, Solaris und HP-UX erhältlich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://users.ece.gatech.edu/%7Ebonnie/book/TUTORIAL/tutorial.html - Englischsprachiges MATLAB-Tutorial&lt;br /&gt;
* http://www.mathworks.com/access/helpdesk/help/techdoc/matlab.shtml - MATLAB-Referenz&lt;br /&gt;
* http://www.eng.auburn.edu/~sjreeves/Classes/DSP/DSP.html - MATLAB for DSP (allgemeine Tipps und Hinweise)&lt;br /&gt;
&lt;br /&gt;
=== Octave ===&lt;br /&gt;
&lt;br /&gt;
Das Open-Source-Programm Octave zeichnet sich durch einen hohen Grad an Matlab-Kompatibilität aus; das geht so weit, dass man problemlos die Matlab-Online-Hilfe und Matlab-Einführungen zum Lernen verwenden kann. Im Zusatzpaket Octave-Forge sind auch viele Funktionen der Matlab-Toolboxes enthalten (z.&amp;amp;nbsp;B. Filterdesign, Signalverarbeitung). Octave ist ein reines Kommandozeilenprogramm, so dass man auf alle Annehmlichkeiten der Matlab-GUI verzichten muss. Zum Plotten wird gnuplot verwendet.&lt;br /&gt;
&lt;br /&gt;
Octave lässt sich auf praktisch jedem Unix-System kompilieren. Für Windows gibt es ein fertig kompiliertes Paket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://octave.sourceforge.net/ - Übersicht über alle Funktionen von Octave/Octave-Forge&lt;br /&gt;
&lt;br /&gt;
=== Scilab / Scicos ===&lt;br /&gt;
&lt;br /&gt;
Auch das Open-Source-Programmpaket Scilab / Scicos, ähnlich leistungsfähig wie Matlab und seine Zusatzmodule, ist kostenlos und im Quelltext erhältlich. Während die Grundsyntax (Kontrollstrukturen, Ausdrücke) weitgehend Matlab-kompatibel ist, gibt es bei den Funktionen z.T. deutliche Abweichungen. Dafür bietet Scilab / Scicos verglichen mit Octave umfangreichere Möglichkeiten zur grafischen Darstellung, die über das 2D- und 3D-Plotten von Funktionen weit hinausgehen, z.&amp;amp;nbsp;B. lassen sich Linien, Kreise usw. zeichnen.&lt;br /&gt;
&lt;br /&gt;
Scilab / Scicos läuft unter Windows, Linux/Unix und Mac OS X. Für die wichtigsten Linux-Distributionen sind fertige, komplette Binärpakete (RPM, ...) zur einfachen Installation frei verfügbar. Für Windows gibt es ebenfalls ein einfach zu installierendes Komplettpaket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scilab.org/ Scilab Homepage (Universelles Wissenschaftlich-Technisches Mathematik-Paket)]&lt;br /&gt;
* [http://www.scicos.org/ Scicos Homepage (Modellations- und Simulations-Paket für Scilab, ist im Scilab-Download enthalten)]&lt;br /&gt;
* [http://www-rocq.inria.fr/scicos/scicosmodnum.html ModNum Digital communication toolbox zu Scicos]&lt;br /&gt;
* [http://www.scilab.org/publications/index_publications.php?page=freebooks Übersicht zur Literatur: Webtexte, Bücher und Zeitschriftenartikel]&lt;br /&gt;
&#039;&#039;&#039;Bücher&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scicos.org/book.html Modeling and Simulation in Scilab/Scicos, (für Version 3.0, aktuell ist Version 4.1.2)]&lt;br /&gt;
&#039;&#039;&#039;Tutorials&#039;&#039;&#039;:&lt;br /&gt;
* [http://wiki.scilab.org/Tutorials?action=AttachFile&amp;amp;do=get&amp;amp;target=signal.pdf Signal Processing with Scilab (1998)], [http://wuarchive.wustl.edu/pub/aminet/misc/math/scilab-doc.lha Beispielfiles dazu lha-gepackt (1996)] [http://aminet.net/package/misc/math/scilab-doc oder hier], [http://viewvc.scilab.org/bin/cgi/viewvc.cgi/trunk/scilab_doc/signal/Nfigs_source/ hier auch einzeln erhältlich]&lt;br /&gt;
* [http://www.scilab.org/publications/delicado/scilab.pdf DSP-Tutorial in spanisch, teilweise aus dem englischen Tutorial entnommen]&lt;br /&gt;
* [http://www.neurotraces.com/scilab/scilab2/index.html Treatment of neurophysiological signals using Scilab, HTML-Texte mit Kapiteln zu Filtern, FFT usw.]&lt;br /&gt;
* [http://www.scilab.org/publications/TELECOM/ComNumSc.zip Digital-Kommunikation - französisches Tutorial, gezipptes Postscript]&lt;br /&gt;
* [http://www.mate.tue.nl/mate/pdfs/6827.pdf Beispielprojekt mit Vergleich SciCos und SciLab]&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ein DSP (&#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ignal &#039;&#039;&#039;P&#039;&#039;&#039;rocessor) ist eine spezielle CPU mit einem auf die Verarbeitung von Signalen optimierten Kern und Befehlssatz. Unterschieden wird hauptsächlich zwischen Gleitkomma- und Festkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
Charakteristisches Merkmal vieler DSPs ist eine VLIW-Architektur (&#039;&#039;&#039;V&#039;&#039;&#039;ery &#039;&#039;&#039;L&#039;&#039;&#039;ong &#039;&#039;&#039;I&#039;&#039;&#039;nstruction &#039;&#039;&#039;W&#039;&#039;&#039;ord). Dabei werden Anweisungen für mehrere parallele Ausführungseinheiten (Multiplizierer/Addierer/Akkumulatoren) und mehrere Lade-/Speicherbefehle in einem einzigen, langen Befehlswort kodiert, und in einem Takt ausgeführt. Dazu kommen häufig mehrere gleichzeitig adressierbare Speicherbänke, Unterstützung für Ringpuffer, Schleifen ohne Sprung-Overhead, Bit-Reverse-Adressierung (wichtig für FFT) und Arithmetik mit Sättigungs- statt Überlaufverhalten (wichtig für die Realisierung von IIR-Filtern).&lt;br /&gt;
&lt;br /&gt;
Seit ein paar Jahren beginnen die Grenzen zwischen Mikrocontrollern und DSPs etwas zu verschwimmen. Viele Mikrocontroller werden mit zusätzlichen DSP-Funktionen ausgestattet ([[PICCOLO]], [[dsPIC]], [[ARM]]), während DSPs zunehmend in Richtung der Aufgabenbereiche eines Mikrocontrollers oder Allround-Prozessors vordringen und immer öfter um Unterstützung für Betriebssysteme (MMU) oder I/O-Funktionen wie Ethernet oder USB erweitert werden ([[Blackfin]]).&lt;br /&gt;
&lt;br /&gt;
Eine noch größere DSP-Rechenleistung kann mit programmierbaren Logikbausteinen (&#039;&#039;&#039;[[FPGA]]&#039;&#039;&#039;s) erzielt werden, da die Anzahl gleichzeitig ausführbarer Rechenoperationen nur durch die Größe des FPGAs begrenzt wird. Nachteilig sind die gegenüber DSPs um ein vielfaches höheren Kosten, höherer Stromverbrauch und höherer Entwicklungsaufwand, weshalb FPGAs für Signalverarbeitung nur in sehr speziellen Anwendungen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aktuelle &#039;&#039;&#039;PC-Prozessoren&#039;&#039;&#039; sind sehr gut für Gleitkomma-Signalverarbeitung geeignet. Wenn keine besonderen Anforderungen an Echtzeitfähigkeit, Strom- oder Platzbedarf gestellt werden, hat ein normaler PC mit Abstand das beste Preis/Leistungsverhältnis. Der erste Schritt bei einem DSP-Projekt sollte somit eine Implementierung auf dem PC sein. Es macht wenig Sinn, ein Eval-Board für einen Signalprozessor zu kaufen und einfach loszulegen.&lt;br /&gt;
&lt;br /&gt;
=== Fest- oder Gleitkomma? ===&lt;br /&gt;
&lt;br /&gt;
Signalverarbeitung auf einem Gleitkomma- (Floating-Point-) Rechner ist grundsätzlich einfacher als auf einem Festkomma- (Fixed-Point-) Rechner. Da die Ungenauigkeiten bei der Rechnung mit Floating-Point-Zahlen in vielen Fällen vernachlässigbar sind, kann man einen Algorithmus i.d.R. 1:1 in Programmcode umsetzen. Hat man nur Festkomma-Rechenoperationen zur Verfügung wird es etwas ungemütlich. Man muss sich Gedanken um die Skalierung der Daten, die Reihenfolge von Rechenoperationen, Überläufe, Rundungsrauschen usw. machen. Da Gleitkomma-DSPs allerdings teurer sind und mehr Strom verbrauchen, werden für Massenprodukte fast ausschließlich Festkomma-DSPs bzw. ASICs mit Festkomma-Rechenwerken verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TI C2000 ===&lt;br /&gt;
&lt;br /&gt;
Eine komplette 32-bit DSC Controller Familie vom low-cost ([http://www.ti.com/corp/docs/landing/f280xx-piccolo/index.htm PICCOLO]) bis high-end Controller mit FPU ([http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=mcu&amp;amp;sectionId=95&amp;amp;tabId=2108&amp;amp;familyId=1414&amp;amp;paramCriteria=no TMS320F28335]).&lt;br /&gt;
Die Peripherie umfasst Mehrkanal A/D Wandler mit 12-bit Aufloesung und bis zu 4 Megasamples Abtastrate. Die PWMs haben einen hochauflösenden Modus, der bis zu 150ps auflösen kann. Als Interface stehen CAN, I2C, schnelle generelle serielle Ports und Quadratureingänge für Drehgeber zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== TI C5000 ===&lt;br /&gt;
&lt;br /&gt;
DSP für batteriebetriebene Anwendungen. Die gesamte Architektur wurde auf Stromverbrauch optimiert. Dazu werden spezielle Werkzeuge zur Verfügung gestellt, die zur Anwendung passende Optimierungslösungen generiert. [[TMS320VC5505 eZDSP USB Stick‎]] mit IDE als preisgünstiges Entwicklungssystem ( &amp;lt; 50€)&lt;br /&gt;
&lt;br /&gt;
=== TI C6000 ===&lt;br /&gt;
&lt;br /&gt;
DSP-Familie vom Marktführer Texas Instruments enthält sowohl Fest- als auch Gleitkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
=== TI DM6400 (DaVinci) ===&lt;br /&gt;
&lt;br /&gt;
DSP für Videoanwendungen. Einige Derivate enthalten auch einen ARM9 als Co-Prozessor. Diese Familie wird unter dem Namen [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=dsp&amp;amp;sectionId=2&amp;amp;tabId=1852&amp;amp;familyId=1300 DaVinci] vermarktet.&lt;br /&gt;
&lt;br /&gt;
=== TI OMAP ===&lt;br /&gt;
&lt;br /&gt;
Prozessor für mobile Geräte, enthält einen ARM-Kern und einen C6000-DSP. Ein interessantes und mit $149 sehr preisgünstiges Evalboard ist das [http://www.beagleboard.org Beagle Board]. Ein kostenloser Assembler für den DSP ist verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== SHARC/TigerSHARC ===&lt;br /&gt;
&lt;br /&gt;
32-Bit-Gleitkomma-DSP von Analog Devices.&lt;br /&gt;
&lt;br /&gt;
=== Blackfin ===&lt;br /&gt;
&lt;br /&gt;
Der Blackfin ist ein 16/32-Bit-Festkomma-DSP von Analog Devices. Im Gegensatz zu den 16-bittigen Vorgängern ADSP-21xx, die häufig als Co-Prozessoren zur Signalverarbeitung zusammen mit einem Mikrocontroller verwendet werden, geht der Blackfin schon weit in den Einsatzbereich eines Allround-Prozessors hinein. So gibt es z.&amp;amp;nbsp;B. einen Linux-Port für Blackfin, Eval-Boards mit Ethernet, CAN, USB und vielen MB SDRAM. Dank der verbesserten Stromsparfunktionen der BF52x-Reihe ist diese eher neue Architektur vermehrt in mobilen Geräten (Kameras, Mediaplayer, etc.) anzutreffen.&lt;br /&gt;
&lt;br /&gt;
Wichtig für die Entwicklung ist zu wissen:&lt;br /&gt;
&lt;br /&gt;
* Keine Fließkomma-Unterstützung in Hardware&lt;br /&gt;
* Keine MMU, keine Unterstützung für virtuellen Speicher (kein Unix fork(), etc.)&lt;br /&gt;
&lt;br /&gt;
Unterstützte Entwicklungswerkzeuge:&lt;br /&gt;
&lt;br /&gt;
* Visual DSP++: Hauseigenes Entwicklungswerkzeug von Analog Devices, kommerziell&lt;br /&gt;
* GCC: Freie GNU-Umgebung mit Assembler, Compiler, Linker, Debugger&lt;br /&gt;
* Eclipse für uClinux-Entwicklung wie auch &#039;nackt&#039; ohne OS&lt;br /&gt;
&lt;br /&gt;
Aufgrund der ausgereiften GNU-Toolchain ist der Blackfin eine der kostengünstigsten Plattformen für die Entwicklung. Die Werkzeuge laufen sowohl unter Windows32 als auch Linux, bevorzugt wird jedoch Linux eingesetzt. Für die Kernel-Entwicklung ist Linux unabdingbar.&lt;br /&gt;
Dank offener JTAG-Spezifikation existieren einige Werkzeuge von Drittherstellern zum Hardware-Debugging (In-Circuit Emulation) und zur Programmierung:&lt;br /&gt;
&lt;br /&gt;
* [http://www.section5.ch/icebear ICEbear] JTAG: schneller USB-&amp;gt;JTAG adapter&lt;br /&gt;
* [http://www.ronetix.at/ PEEDI] High end JTAG, Ethernet&lt;br /&gt;
* [http://www.bluetechnix.at/rainbow2006/site/blackfin_family/__dev_tools/__gnice_jtag/409/gnice_jtag.aspx gnICE von Bluetechnix]&lt;br /&gt;
* [http://www.analog.com/en/processors-dsp/blackfin/emulator-100/processors/product.html JTAG-Adapter von Analog Devices]&lt;br /&gt;
&lt;br /&gt;
Beide Werkzeuge arbeiten auch mit ARM-Prozessoren.&lt;br /&gt;
&lt;br /&gt;
Weitere Links:&lt;br /&gt;
&lt;br /&gt;
* [http://www.bluetechnix.com/rainbow2006/default.aspx Bluetechnix Core-Module]&lt;br /&gt;
* [http://www.analog.com/blackfin Herstellerwebsite]&lt;br /&gt;
* [http://blackfin.uclinux.org/ uClinux Port und GNU toolchain]&lt;br /&gt;
&lt;br /&gt;
=== dsPIC ===&lt;br /&gt;
&lt;br /&gt;
Der [[dsPIC]] ist ein kleiner 16 Bit-Mikrocontroller mit DSP-Funktionen. Mit dem klassischen 8Bit-PIC hat er außer dem Namen nichts gemeinsam.&lt;br /&gt;
&lt;br /&gt;
Er basiert auf der modernen RISC-Architektur des PIC24 und bietet zusätzlich 40Bit Register und spezielle Befehle für DSP-Anwendungen. Der derzeit schnellste dsPIC33E arbeitet mit bis zu 70MIPS. dsPIC33 gibt es sogar im DIL28-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
Ein kostenloser C-Compiler (C30) und eine DSP-Bibliothek wird von Microchip angeboten. Dabei handelt es sich um eine &amp;quot;Lite&amp;quot;-Version des kommerziellen C30, bei dem nur eine Optimierungsstufe freigeschaltet ist, aber ansonsten keine Einschränkungen (Codegröße o.ä.) bestehen.&lt;br /&gt;
&lt;br /&gt;
=== TriCore ===&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;TriCore&#039;&#039;&#039; von Infineon ist ein 32-Bit-Mikrocontroller mit DSP-Funktionen, mit derzeitigem Schwerpunkt im Bereich der High Performance Embedded Real-Time Systems für Industrie-  und Automobilanwendungen (Beispiele: Motorsteuerungen, Servomotoren, Solarinverter, Multi-Axis-Conrol) &lt;br /&gt;
&lt;br /&gt;
* [http://www.infineon.com/cgi-bin/ifx/portal/ep/channelView.do?channelId=-78991&amp;amp;channelPage=%2Fep%2Fchannel%2FleafNote.jsp&amp;amp;pageTypeId=17099  Übersicht über die &#039;&#039;&#039;TriCore&#039;&#039;&#039; Produktfamilie]&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen für Starterkits/Evalboards ===&lt;br /&gt;
&lt;br /&gt;
* http://www.spectrumdigital.com - große Auswahl an Starterkits mit TI-DSPs, ab $300&lt;br /&gt;
* http://www.bluetechnix.com - Blackfin-Module ab € 150&lt;br /&gt;
* http://www.zbrain.ch/ - Blackfin-Modul, Preis: ?&lt;br /&gt;
* http://www.danvillesignal.com/ - ADSP-218x-Boards ab $200, Sharc-Boards ab $400&lt;br /&gt;
* http://docs.blackfin.uclinux.org/doku.php?id=buy_stuff - Blackfin BF533 STAMP $170 (keine analogen Schnittstellen, aber über Pfostenstecker leicht zu erweitern)&lt;br /&gt;
* http://www.sundance.com - High-End-Module mit TI C6000&lt;br /&gt;
* http://www.spectrumsignal.com/ - TMS320 und SHARC&lt;br /&gt;
* http://www.pentek.com/dspcentral/ - TMS430 und PowerPC&lt;br /&gt;
* http://www.bittware.com/ - SHARC und TigerSHARC&lt;br /&gt;
* http://www.hunteng.co.uk/ - C6000&lt;br /&gt;
* http://www.kanecomputing.co.uk&lt;br /&gt;
* http://www.dsp-systeme.net - DSP-Module mit DSP von TI und ADI&lt;br /&gt;
* http://search.digikey.com/scripts/DkSearch/dksus.dll?lang=de&amp;amp;site=DE&amp;amp;WT.z_homepage_link=hp_go_button&amp;amp;KeyWords=TMDX5505EZDSP&amp;amp;x=22&amp;amp;y=22  eZDSP  USB Stick , &amp;lt;50€&lt;br /&gt;
* http://www.dsp-weuffen.de  - TI C6727 Board und vielen Beispielen&lt;br /&gt;
* http://www.ehitex.de/artikel.php?xPD=131_132&amp;amp;kat_name= - Infineon TriCore Starter Kits&lt;br /&gt;
&lt;br /&gt;
== Weitere Infos==&lt;br /&gt;
&lt;br /&gt;
===Literatur ===&lt;br /&gt;
* Oppenheim, Schaefer: &amp;quot;Discrete Time Signal Processing&amp;quot;, ISBN 0131988425&lt;br /&gt;
* Proakis: &amp;quot;Digital Signal Processing&amp;quot;, ISBN 0131873741&lt;br /&gt;
* Lyons: &amp;quot;Understanding Digital Signal Processing&amp;quot;, ISBN 0131089897&lt;br /&gt;
* Smith: &amp;quot;The Scientist and Engineer&#039;s Guide to Digital Signal Processing&amp;quot;, ISBN  075067444X (unter http://dspguide.com/ als PDF verfügbar)&lt;br /&gt;
* Sanjit K. Mitra: &amp;quot;Handbook for Digital Signal Processing&amp;quot; (1993,1312 Seiten), ISBN 0471619957&lt;br /&gt;
&lt;br /&gt;
=== Foren ===&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-10-1.html DSP-Forum auf mikrocontroller.net (deutsch)]&lt;br /&gt;
* [http://groups.google.de/group/comp.dsp Newsgroup comp.dsp (Englisch)]&lt;br /&gt;
* [http://www.dsprelated.com/groups.php Discussion Groups (Englisch)]&lt;br /&gt;
&lt;br /&gt;
=== Webseiten ===&lt;br /&gt;
* http://www.dspguru.com/ - FAQs, Infos, Beispielcode, ...&lt;br /&gt;
* http://docs.google.com/View?docid=dg2hppb_4gtgk89 - evtl. interessant als Rohmaterial für diesen Artikel&lt;br /&gt;
* http://www.dsprelated.com - Blogs, Jobs, Comp.DSP, ...&lt;br /&gt;
* http://www.unidsp56.de/ Eine Entwicklungsplattform für den Amateur&lt;br /&gt;
* http://de.wikipedia.org/wiki/Datei:Aircraft-recognition-and-tracking-by-dsp-based-signal-processing.jpg&lt;br /&gt;
&lt;br /&gt;
=== Artikel aus der Kategorie DSP ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ncl style=compact maxdepth=2 headings=bullet headstart=2&lt;br /&gt;
      showcats=1 showarts=1&amp;gt;DSP&amp;lt;/ncl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=66873</id>
		<title>Digitale Signalverarbeitung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=66873"/>
		<updated>2012-06-14T21:23:52Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* SHARC/TigerSHARC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Anwendungsgebiete ==&lt;br /&gt;
&lt;br /&gt;
* Modulation/Demodulation zur Datenübertragung (z.&amp;amp;nbsp;B. Telefonmodem, DSL, GSM) - &amp;quot;Software Defined Radio&amp;quot; (SDR)&lt;br /&gt;
* Multimediacodierung (MP3, DivX, JPEG)&lt;br /&gt;
* Bildverarbeitung (Bildverbesserung)&lt;br /&gt;
* Mustererkennung, Objekterkennung&lt;br /&gt;
* Echo- und Störgeräuschunterdrückung bei Telefonen, Sprechgarnituren (Headsets) und Hörgeräten&lt;br /&gt;
&lt;br /&gt;
== Verfahren ==&lt;br /&gt;
&lt;br /&gt;
=== FIR- und IIR-Filter ===&lt;br /&gt;
&lt;br /&gt;
Die häufigste Aufgabe in der DSV ist das Filtern, das heißt, bestimmte Frequenzanteile zu unterdrücken, zu verstärken oder in der Phase zu verschieben. Man kann grundsätzlich zwischen zwei Filterarten unterscheiden:&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;FIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;F&#039;&#039;&#039;inite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) wird jeder Ausgangswert aus der Summe unterschiedlich gewichteter Eingangswerte zusammengesetzt, die dazu in Schieberegistern vorgehalten werden. Dabei bezeichnet man die maximale Anzahl an Werten, die bei der Berechnung berücksichtigt werden, als &#039;&#039;&#039;Ordnung&#039;&#039;&#039; oder auch Filtertiefe. Je höher die Ordnungszahl, desto besser nähern sich die die Eigenschaften des realen Filters bez. ripple, Steilheit und z.B. Dämpfung an das theoretische Ideal an, desto höher ist aber auch der Rechenaufwand.&lt;br /&gt;
&lt;br /&gt;
Werden bei FIR-Filtern nur zurückliegende Werte verwendet, so handelt es sich um ein &amp;quot;look back&amp;quot; - Filter. Dieses ist typisch für real time Anwendungen. Werden auch Werte verwendet, die nach dem eigentlichen Bezugzeitpunkt liegen, spricht man von einem look ahead-Filter. Dieses kann naturgemäß nicht in Echtzeit angewendet werden, bzw die Ausgabezeitpunkte müssen um mindestens die halbe Filtertiefe verzögert werden.&lt;br /&gt;
&lt;br /&gt;
==== Merkmale von FIR-Filtern ====&lt;br /&gt;
* immer stabil&lt;br /&gt;
* linearer Phasengang -&amp;gt; keine Phasenverzerrungen&lt;br /&gt;
* Ordnungen oft im zwei- bis dreistelligen Bereich&lt;br /&gt;
* problemlos realisierbar!&lt;br /&gt;
&lt;br /&gt;
==== Beispiel ====&lt;br /&gt;
Seien D(0), D(1) ... D(t) die eingehenden Daten, so wäre Y(t) = 1/k * (D(t) + D(t-1) + D(t-2) + ... + (t-k)) ein einfaches FIR-Filter der Ordnung &amp;quot;k&amp;quot;, das als gleitender Mittelwert bezeichnet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu FIR-Filtern werden bei &#039;&#039;&#039;IIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;I&#039;&#039;&#039;nfinite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) auch frühere &#039;&#039;&#039;Ausgangs&#039;&#039;&#039;werte in die Berechnung des aktuellen Ausgangswertes mit einbezogen. Wie man sich leicht vorstellen kann, kann dadurch die Antwort auf einen Eingangsimpuls theoretisch unendlich lang werden, da jeder Ausgangswert auf den Eingang rückgekoppelt wird.&lt;br /&gt;
&lt;br /&gt;
====Merkmale von IIR-Filtern====&lt;br /&gt;
* durch Rundungsfehler kann das [[Filter]] instabil werden -&amp;gt; &amp;quot;Aufschaukeln&amp;quot; durch Rückkopplung -&amp;gt; schwierigere Realisierung&lt;br /&gt;
* kein linearer Phasengang -&amp;gt; verschiedene Frequenzanteile werden durch den Filter unterschiedlich lange verzögert -&amp;gt; &amp;quot;Verzerrung&amp;quot;&lt;br /&gt;
* einziger Vorteil gegenüber FIR: Um einen gewünschten Frequenzgang zu erzielen, ist eine sehr viel niedrigere Ordnung ausreichend -&amp;gt; weniger Rechenaufwand&lt;br /&gt;
* Ordnung üblicherweise &amp;lt; 10&lt;br /&gt;
&lt;br /&gt;
==== Beispiel====&lt;br /&gt;
Seien D(0), D(1) ... D(t) wieder die eingehenden Daten, wie oben, und Y(t-1) der um einen Berechungsschritt zeitlich verzögerte Wert des Filterwertes Y(t), dann wäre Y(t) = Y(t-1) * (1-k)  +  D(t) * k ein IIR-Filter erster Ordnung, wobei 1/k die Dämpfung und damit die Grenzfrequenz des Filters bestimmt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Viele nützliche Informationen zur Realisierung gibt es im [http://www.dspguru.com/info/faqs/ FIR- und IIR-FAQ auf dspguru.com] (der dort erwähnte Sourcecode FirAlgs.c kann [[Media:FirAlgs.c|hier]] direkt heruntergeladen werden).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Berechnungssoftware&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.filter-solutions.com/digital.html Beschreibung der Digitalfiltertypen], [http://www.nuhertz.com/download.html hier kostenlose Testversion Filter Free]&lt;br /&gt;
&lt;br /&gt;
=== DFT und FFT ===&lt;br /&gt;
&lt;br /&gt;
Die FFT (Fast Fourier Transform) ist ein schneller Algorithmus zur Berechnung der DFT (Discrete Fourier Transform). Damit bezeichnet man die Transformation eines Zeitsignals (= eine Abfolge von Samples) in den Frequenzbereich (= Frequenzbestandteile des Signals). Die Transformation kann auch ohne Verlust umgekehrt durchgeführt werden, also vom Frequenz- in den Zeitbereich (Inverse Discrete Fourier Transform, IDFT). Eine DFT wird praktisch immer mit dem FFT-Algorithmus realisiert, weshalb die Bezeichnungen FFT/DFT oft gleichwertig verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die offensichtlichste Anwendung der FFT ist die Darstellung des Frequenzspektrums eines Signals. Aber das ist nur ein kleiner Teil der Anwendungsmöglichkeiten. Viele Verarbeitungen lassen sich im Frequenzbereich einfacher durchführen als im Zeitbereich, z.&amp;amp;nbsp;B. Korrelationen oder sehr lange FIR-Filter. Das zu verarbeitende Signal wird dazu in den Frequenzbereich transformiert, dort manipuliert, und wieder in den Zeitbereich zurücktransformiert. Das klingt vielleicht umständlich, kann aber in der Praxis sehr viel schneller sein als eine Realisierung im Zeitbereich.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/25095 Diskussion: FFT auf dem AVR]&lt;br /&gt;
* [http://sourceforge.net/projects/kissfft/ Kiss FFT] - einfache FFT-Bibliothek, in C, Floating- und Fixed Point, BSD-Lizenz, geeignet für Mikrocontroller&lt;br /&gt;
* [http://www.fftw.org/ FFTW] - &#039;&#039;&#039;die&#039;&#039;&#039; Floating Point FFT-Bibliothek für PCs, GPL-Lizenz&lt;br /&gt;
*[http://www.sprut.de/electronic/pic/16bit/dsp/fft/fft.htm FFT - verständlich auch für Nichtakademiker (Deutsch)]&lt;br /&gt;
* [http://www.science.smith.edu/departments/Physics/fstaff/gfelder/ffteasy/ ffteasy - Einfache Routinen zur FFT]&lt;br /&gt;
&lt;br /&gt;
==== Goertzel-Algorithmus ====&lt;br /&gt;
&lt;br /&gt;
Liegt das Interesse bei der Berechnung einer DFT / FFT nur bei wenigen bestimmten Frequenz-Linien, so gibt es eine weniger rechenaufwendige Alternative mit diesem Algorithmus. Die Grenze, ab der Goertzel-Algo nicht mehr effektiv genug ist, liegt grob bei etwa 15% der Spektralfrequenzen.&lt;br /&gt;
&lt;br /&gt;
Das typische Anwendungsgebiet sind DTMF-Dekoder in Software.&lt;br /&gt;
Hierfür sind sogar die üblichen 8-bit-AVR-Controller ausreichend schnell.&lt;br /&gt;
&lt;br /&gt;
=== Signalerzeugung ===&lt;br /&gt;
&lt;br /&gt;
Für die Korrelation von Eingangssignalen mit zuvor ausgesendeten oder bekannten Signalformen zwecks Mustererkennung müssen oftmals eigenen Signale generiert werden.&lt;br /&gt;
&lt;br /&gt;
Rechteck-, Sägezahn- und Dreieckssignale lassen sich mit einfachen Zählern realisieren. &lt;br /&gt;
&lt;br /&gt;
Möchte man Sinus- oder beliebige andere Signalformen erzeugen, bietet es sich an, vorausberechnete Funktionswerte im Speicher abzulegen und der Reihe nach auszugeben. Eine variable Frequenzeinstellung kann man durch die Methode der Direkten Digitalen Synthese (&#039;&#039;&#039;DDS&#039;&#039;&#039;) realisieren.&lt;br /&gt;
&lt;br /&gt;
* [[Digitaler Funktionsgenerator]] - ausführliche Erklärung des Verfahrens im PDF, Beispielcode für AVR&lt;br /&gt;
* http://www.myplace.nu/avr/minidds/ - noch ein AVR-Projekt&lt;br /&gt;
* http://www.hit.bme.hu/~papay/sci/DDS/start.htm - noch eine Erklärung&lt;br /&gt;
&lt;br /&gt;
Eine weitere Methode zur Realisierung von (mehr oder weniger beliebigen) Funktionen ist die &#039;&#039;&#039;Polynomapproximation&#039;&#039;&#039;. Dabei nähert man die zu erzeugende Funktion durch ein Polynom an und verwendet das Horner-Schema, um die einzelnen Funktionswerte zu berechnen. Für ein Polynom der Ordnung N benötigt man damit pro Wert N+1 Multiplikationen (N ist üblicherweise &amp;lt;= 10).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Zur Entwicklung von Signalverarbeitungsverfahren gibt es eine ganze Reihe von Programmen. Neben kleinen Werkzeugen für den Filterentwurf und spezialisierten Bibliotheken zum Einbinden in eigene Programme existieren mehrere Mathematikprogramme, mit denen sich Signale verarbeiten und darstellen lassen. Die drei wichtigsten sind Matlab, Octave und Scilab.&lt;br /&gt;
&lt;br /&gt;
=== MATLAB ===&lt;br /&gt;
&lt;br /&gt;
MATLAB ist das Standardprogramm für numerische Mathematik. In der digitalen Signalverarbeitung wird es häufig verwendet, um einen Algorithmus vor der Umsetzung in C-Code oder auf einen DSP zu entwickeln und zu testen. Zum schon recht hohen Preis der Grundsoftware muss man noch einige hundert Euro für diverse Toolboxes einplanen (Signal Processing, Filter Design, Image Processing). Die [http://www.mikrocontroller.net/link/isbn/0979223903 Studentenversion] kostet ca. 80 Euro (die Signal Processing Toolbox und ein paar andere sind bereits enthalten).&lt;br /&gt;
&lt;br /&gt;
MATLAB ist für Windows, Linux, Mac OS X, Solaris und HP-UX erhältlich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://users.ece.gatech.edu/%7Ebonnie/book/TUTORIAL/tutorial.html - Englischsprachiges MATLAB-Tutorial&lt;br /&gt;
* http://www.mathworks.com/access/helpdesk/help/techdoc/matlab.shtml - MATLAB-Referenz&lt;br /&gt;
* http://www.eng.auburn.edu/~sjreeves/Classes/DSP/DSP.html - MATLAB for DSP (allgemeine Tipps und Hinweise)&lt;br /&gt;
&lt;br /&gt;
=== Octave ===&lt;br /&gt;
&lt;br /&gt;
Das Open-Source-Programm Octave zeichnet sich durch einen hohen Grad an Matlab-Kompatibilität aus; das geht so weit, dass man problemlos die Matlab-Online-Hilfe und Matlab-Einführungen zum Lernen verwenden kann. Im Zusatzpaket Octave-Forge sind auch viele Funktionen der Matlab-Toolboxes enthalten (z.&amp;amp;nbsp;B. Filterdesign, Signalverarbeitung). Octave ist ein reines Kommandozeilenprogramm, so dass man auf alle Annehmlichkeiten der Matlab-GUI verzichten muss. Zum Plotten wird gnuplot verwendet.&lt;br /&gt;
&lt;br /&gt;
Octave lässt sich auf praktisch jedem Unix-System kompilieren. Für Windows gibt es ein fertig kompiliertes Paket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://octave.sourceforge.net/ - Übersicht über alle Funktionen von Octave/Octave-Forge&lt;br /&gt;
&lt;br /&gt;
=== Scilab / Scicos ===&lt;br /&gt;
&lt;br /&gt;
Auch das Open-Source-Programmpaket Scilab / Scicos, ähnlich leistungsfähig wie Matlab und seine Zusatzmodule, ist kostenlos und im Quelltext erhältlich. Während die Grundsyntax (Kontrollstrukturen, Ausdrücke) weitgehend Matlab-kompatibel ist, gibt es bei den Funktionen z.T. deutliche Abweichungen. Dafür bietet Scilab / Scicos verglichen mit Octave umfangreichere Möglichkeiten zur grafischen Darstellung, die über das 2D- und 3D-Plotten von Funktionen weit hinausgehen, z.&amp;amp;nbsp;B. lassen sich Linien, Kreise usw. zeichnen.&lt;br /&gt;
&lt;br /&gt;
Scilab / Scicos läuft unter Windows, Linux/Unix und Mac OS X. Für die wichtigsten Linux-Distributionen sind fertige, komplette Binärpakete (RPM, ...) zur einfachen Installation frei verfügbar. Für Windows gibt es ebenfalls ein einfach zu installierendes Komplettpaket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scilab.org/ Scilab Homepage (Universelles Wissenschaftlich-Technisches Mathematik-Paket)]&lt;br /&gt;
* [http://www.scicos.org/ Scicos Homepage (Modellations- und Simulations-Paket für Scilab, ist im Scilab-Download enthalten)]&lt;br /&gt;
* [http://www-rocq.inria.fr/scicos/scicosmodnum.html ModNum Digital communication toolbox zu Scicos]&lt;br /&gt;
* [http://www.scilab.org/publications/index_publications.php?page=freebooks Übersicht zur Literatur: Webtexte, Bücher und Zeitschriftenartikel]&lt;br /&gt;
&#039;&#039;&#039;Bücher&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scicos.org/book.html Modeling and Simulation in Scilab/Scicos, (für Version 3.0, aktuell ist Version 4.1.2)]&lt;br /&gt;
&#039;&#039;&#039;Tutorials&#039;&#039;&#039;:&lt;br /&gt;
* [http://wiki.scilab.org/Tutorials?action=AttachFile&amp;amp;do=get&amp;amp;target=signal.pdf Signal Processing with Scilab (1998)], [http://wuarchive.wustl.edu/pub/aminet/misc/math/scilab-doc.lha Beispielfiles dazu lha-gepackt (1996)] [http://aminet.net/package/misc/math/scilab-doc oder hier], [http://viewvc.scilab.org/bin/cgi/viewvc.cgi/trunk/scilab_doc/signal/Nfigs_source/ hier auch einzeln erhältlich]&lt;br /&gt;
* [http://www.scilab.org/publications/delicado/scilab.pdf DSP-Tutorial in spanisch, teilweise aus dem englischen Tutorial entnommen]&lt;br /&gt;
* [http://www.neurotraces.com/scilab/scilab2/index.html Treatment of neurophysiological signals using Scilab, HTML-Texte mit Kapiteln zu Filtern, FFT usw.]&lt;br /&gt;
* [http://www.scilab.org/publications/TELECOM/ComNumSc.zip Digital-Kommunikation - französisches Tutorial, gezipptes Postscript]&lt;br /&gt;
* [http://www.mate.tue.nl/mate/pdfs/6827.pdf Beispielprojekt mit Vergleich SciCos und SciLab]&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ein DSP (&#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ignal &#039;&#039;&#039;P&#039;&#039;&#039;rocessor) ist eine spezielle CPU mit einem auf die Verarbeitung von Signalen optimierten Kern und Befehlssatz. Unterschieden wird hauptsächlich zwischen Gleitkomma- und Festkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
Charakteristisches Merkmal vieler DSPs ist eine VLIW-Architektur (&#039;&#039;&#039;V&#039;&#039;&#039;ery &#039;&#039;&#039;L&#039;&#039;&#039;ong &#039;&#039;&#039;I&#039;&#039;&#039;nstruction &#039;&#039;&#039;W&#039;&#039;&#039;ord). Dabei werden Anweisungen für mehrere parallele Ausführungseinheiten (Multiplizierer/Addierer/Akkumulatoren) und mehrere Lade-/Speicherbefehle in einem einzigen, langen Befehlswort kodiert, und in einem Takt ausgeführt. Dazu kommen häufig mehrere gleichzeitig adressierbare Speicherbänke, Unterstützung für Ringpuffer, Schleifen ohne Sprung-Overhead, Bit-Reverse-Adressierung (wichtig für FFT) und Arithmetik mit Sättigungs- statt Überlaufverhalten (wichtig für die Realisierung von IIR-Filtern).&lt;br /&gt;
&lt;br /&gt;
Seit ein paar Jahren beginnen die Grenzen zwischen Mikrocontrollern und DSPs etwas zu verschwimmen. Viele Mikrocontroller werden mit zusätzlichen DSP-Funktionen ausgestattet ([[PICCOLO]], [[dsPIC]], [[ARM]]), während DSPs zunehmend in Richtung der Aufgabenbereiche eines Mikrocontrollers oder Allround-Prozessors vordringen und immer öfter um Unterstützung für Betriebssysteme (MMU) oder I/O-Funktionen wie Ethernet oder USB erweitert werden ([[Blackfin]]).&lt;br /&gt;
&lt;br /&gt;
Eine noch größere DSP-Rechenleistung kann mit programmierbaren Logikbausteinen (&#039;&#039;&#039;[[FPGA]]&#039;&#039;&#039;s) erzielt werden, da die Anzahl gleichzeitig ausführbarer Rechenoperationen nur durch die Größe des FPGAs begrenzt wird. Nachteilig sind die gegenüber DSPs um ein vielfaches höheren Kosten, höherer Stromverbrauch und höherer Entwicklungsaufwand, weshalb FPGAs für Signalverarbeitung nur in sehr speziellen Anwendungen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aktuelle &#039;&#039;&#039;PC-Prozessoren&#039;&#039;&#039; sind sehr gut für Gleitkomma-Signalverarbeitung geeignet. Wenn keine besonderen Anforderungen an Echtzeitfähigkeit, Strom- oder Platzbedarf gestellt werden, hat ein normaler PC mit Abstand das beste Preis/Leistungsverhältnis. Der erste Schritt bei einem DSP-Projekt sollte somit eine Implementierung auf dem PC sein. Es macht wenig Sinn, ein Eval-Board für einen Signalprozessor zu kaufen und einfach loszulegen.&lt;br /&gt;
&lt;br /&gt;
=== Fest- oder Gleitkomma? ===&lt;br /&gt;
&lt;br /&gt;
Signalverarbeitung auf einem Gleitkomma- (Floating-Point-) Rechner ist grundsätzlich einfacher als auf einem Festkomma- (Fixed-Point-) Rechner. Da die Ungenauigkeiten bei der Rechnung mit Floating-Point-Zahlen in vielen Fällen vernachlässigbar sind, kann man einen Algorithmus i.d.R. 1:1 in Programmcode umsetzen. Hat man nur Festkomma-Rechenoperationen zur Verfügung wird es etwas ungemütlich. Man muss sich Gedanken um die Skalierung der Daten, die Reihenfolge von Rechenoperationen, Überläufe, Rundungsrauschen usw. machen. Da Gleitkomma-DSPs allerdings teurer sind und mehr Strom verbrauchen, werden für Massenprodukte fast ausschließlich Festkomma-DSPs bzw. ASICs mit Festkomma-Rechenwerken verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TI C2000 ===&lt;br /&gt;
&lt;br /&gt;
Eine komplette 32-bit DSC Controller Familie vom low-cost ([http://www.ti.com/corp/docs/landing/f280xx-piccolo/index.htm PICCOLO]) bis high-end Controller mit FPU ([http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=mcu&amp;amp;sectionId=95&amp;amp;tabId=2108&amp;amp;familyId=1414&amp;amp;paramCriteria=no TMS320F28335]).&lt;br /&gt;
Die Peripherie umfasst Mehrkanal A/D Wandler mit 12-bit Aufloesung und bis zu 4 Megasamples Abtastrate. Die PWMs haben einen hochauflösenden Modus, der bis zu 150ps auflösen kann. Als Interface stehen CAN, I2C, schnelle generelle serielle Ports und Quadratureingänge für Drehgeber zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== TI C5000 ===&lt;br /&gt;
&lt;br /&gt;
DSP für batteriebetriebene Anwendungen. Die gesamte Architektur wurde auf Stromverbrauch optimiert. Dazu werden spezielle Werkzeuge zur Verfügung gestellt, die zur Anwendung passende Optimierungslösungen generiert. [[TMS320VC5505 eZDSP USB Stick‎]] mit IDE als preisgünstiges Entwicklungssystem ( &amp;lt; 50€)&lt;br /&gt;
&lt;br /&gt;
=== TI C6000 ===&lt;br /&gt;
&lt;br /&gt;
DSP-Familie vom Marktführer Texas Instruments enthält sowohl Fest- als auch Gleitkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
=== TI DM6400 (DaVinci) ===&lt;br /&gt;
&lt;br /&gt;
DSP für Videoanwendungen. Einige Derivate enthalten auch einen ARM9 als Co-Prozessor. Diese Familie wird unter dem Namen [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=dsp&amp;amp;sectionId=2&amp;amp;tabId=1852&amp;amp;familyId=1300 DaVinci] vermarktet.&lt;br /&gt;
&lt;br /&gt;
=== TI OMAP ===&lt;br /&gt;
&lt;br /&gt;
Prozessor für mobile Geräte, enthält einen ARM-Kern und einen C6000-DSP. Ein interessantes und mit $149 sehr preisgünstiges Evalboard ist das [http://www.beagleboard.org Beagle Board]. Ein kostenloser Assembler für den DSP ist verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== SHARC/TigerSHARC ===&lt;br /&gt;
&lt;br /&gt;
32-Bit-Gleitkomma-DSP von Analog Devices.&lt;br /&gt;
&lt;br /&gt;
=== Blackfin ===&lt;br /&gt;
&lt;br /&gt;
Der Blackfin ist ein 16/32 Bit Festkomma-DSP von Analog Devices. Im Gegensatz zu den 16-bittigen Vorgängern ADSP-21xx, die häufig als Co-Prozessoren zur Signalverarbeitung zusammen mit einem Mikrocontroller verwendet werden, geht der Blackfin schon weit in den Einsatzbereich eines Allround-Prozessors hinein. So gibt es z.&amp;amp;nbsp;B. einen Linux-Port für Blackfin, Eval-Boards mit Ethernet, CAN, USB und vielen MB SDRAM. Dank der verbesserten Stromsparfunktionen der BF52x-Reihe ist diese eher neue Architektur vermehrt in mobilen Geräten (Kameras, Mediaplayer, etc.) anzutreffen.&lt;br /&gt;
&lt;br /&gt;
Wichtig für die Entwicklung ist zu wissen:&lt;br /&gt;
&lt;br /&gt;
* Kein Fließkomma-Support in Hardware&lt;br /&gt;
* Keine MMU, keine Unterstützung für virtuelles Memory (kein Unix fork(), etc.)&lt;br /&gt;
&lt;br /&gt;
Unterstützte Entwicklungswerkzeuge:&lt;br /&gt;
&lt;br /&gt;
* Visual DSP++: Hauseigenes Entwicklungstool von Analog Devices, kommerziell&lt;br /&gt;
* GCC: Freie GNU-Umgebung mit Assembler, Compiler, Linker, Debugger&lt;br /&gt;
* Eclipse für uClinux-Entwicklung wie auch &#039;standalone&#039; ohne OS&lt;br /&gt;
&lt;br /&gt;
Aufgrund der ausgereiften GNU-Toolchain ist der Blackfin eine der kostengünstigsten Plattformen für die Entwicklung. Die Tools laufen sowohl unter Windows32 als auch Linux, bevorzugt wird jedoch Linux eingesetzt. Für die Kernel-Entwicklung ist Linux unabdingbar.&lt;br /&gt;
Dank offener JTAG-Spezifikation existieren einige Tools von Drittherstellern zum Hardware-Debugging (In Circuit Emulation) und zur Programmierung:&lt;br /&gt;
&lt;br /&gt;
* [http://www.section5.ch/icebear ICEbear] JTAG: schneller USB-&amp;gt;JTAG adapter&lt;br /&gt;
* [http://www.ronetix.at/ PEEDI] High end JTAG, Ethernet&lt;br /&gt;
* [http://www.bluetechnix.at/rainbow2006/site/blackfin_family/__dev_tools/__gnice_jtag/409/gnice_jtag.aspx gnICE von Bluetechnix]&lt;br /&gt;
* [http://www.analog.com/en/processors-dsp/blackfin/emulator-100/processors/product.html JTAG-Adapter von Analog Devices]&lt;br /&gt;
&lt;br /&gt;
Beide Tools arbeiten auch mit ARM-Prozessoren.&lt;br /&gt;
&lt;br /&gt;
Weitere Links:&lt;br /&gt;
&lt;br /&gt;
* [http://www.bluetechnix.com/rainbow2006/default.aspx Bluetechnix Core-Module]&lt;br /&gt;
* [http://www.analog.com/blackfin Herstellerwebsite]&lt;br /&gt;
* [http://blackfin.uclinux.org/ uClinux Port und GNU toolchain]&lt;br /&gt;
&lt;br /&gt;
=== dsPIC ===&lt;br /&gt;
&lt;br /&gt;
Der [[dsPIC]] ist ein kleiner 16 Bit-Mikrocontroller mit DSP-Funktionen. Mit dem klassischen 8Bit-PIC hat er außer dem Namen nichts gemeinsam.&lt;br /&gt;
&lt;br /&gt;
Er basiert auf der modernen RISC-Architektur des PIC24 und bietet zusätzlich 40Bit Register und spezielle Befehle für DSP-Anwendungen. Der derzeit schnellste dsPIC33E arbeitet mit bis zu 70MIPS. dsPIC33 gibt es sogar im DIL28-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
Ein kostenloser C-Compiler (C30) und eine DSP-Bibliothek wird von Microchip angeboten. Dabei handelt es sich um eine &amp;quot;Lite&amp;quot;-Version des kommerziellen C30, bei dem nur eine Optimierungsstufe freigeschaltet ist, aber ansonsten keine Einschränkungen (Codegröße o.ä.) bestehen.&lt;br /&gt;
&lt;br /&gt;
=== TriCore ===&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;TriCore&#039;&#039;&#039; von Infineon ist ein 32-Bit-Mikrocontroller mit DSP-Funktionen, mit derzeitigem Schwerpunkt im Bereich der High Performance Embedded Real-Time Systems für Industrie-  und Automobilanwendungen (Beispiele: Motorsteuerungen, Servomotoren, Solarinverter, Multi-Axis-Conrol) &lt;br /&gt;
&lt;br /&gt;
* [http://www.infineon.com/cgi-bin/ifx/portal/ep/channelView.do?channelId=-78991&amp;amp;channelPage=%2Fep%2Fchannel%2FleafNote.jsp&amp;amp;pageTypeId=17099  Übersicht über die &#039;&#039;&#039;TriCore&#039;&#039;&#039; Produktfamilie]&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen für Starterkits/Evalboards ===&lt;br /&gt;
&lt;br /&gt;
* http://www.spectrumdigital.com - große Auswahl an Starterkits mit TI-DSPs, ab $300&lt;br /&gt;
* http://www.bluetechnix.com - Blackfin-Module ab € 150&lt;br /&gt;
* http://www.zbrain.ch/ - Blackfin-Modul, Preis: ?&lt;br /&gt;
* http://www.danvillesignal.com/ - ADSP-218x-Boards ab $200, Sharc-Boards ab $400&lt;br /&gt;
* http://docs.blackfin.uclinux.org/doku.php?id=buy_stuff - Blackfin BF533 STAMP $170 (keine analogen Schnittstellen, aber über Pfostenstecker leicht zu erweitern)&lt;br /&gt;
* http://www.sundance.com - High-End-Module mit TI C6000&lt;br /&gt;
* http://www.spectrumsignal.com/ - TMS320 und SHARC&lt;br /&gt;
* http://www.pentek.com/dspcentral/ - TMS430 und PowerPC&lt;br /&gt;
* http://www.bittware.com/ - SHARC und TigerSHARC&lt;br /&gt;
* http://www.hunteng.co.uk/ - C6000&lt;br /&gt;
* http://www.kanecomputing.co.uk&lt;br /&gt;
* http://www.dsp-systeme.net - DSP-Module mit DSP von TI und ADI&lt;br /&gt;
* http://search.digikey.com/scripts/DkSearch/dksus.dll?lang=de&amp;amp;site=DE&amp;amp;WT.z_homepage_link=hp_go_button&amp;amp;KeyWords=TMDX5505EZDSP&amp;amp;x=22&amp;amp;y=22  eZDSP  USB Stick , &amp;lt;50€&lt;br /&gt;
* http://www.dsp-weuffen.de  - TI C6727 Board und vielen Beispielen&lt;br /&gt;
* http://www.ehitex.de/artikel.php?xPD=131_132&amp;amp;kat_name= - Infineon TriCore Starter Kits&lt;br /&gt;
&lt;br /&gt;
== Weitere Infos==&lt;br /&gt;
&lt;br /&gt;
===Literatur ===&lt;br /&gt;
* Oppenheim, Schaefer: &amp;quot;Discrete Time Signal Processing&amp;quot;, ISBN 0131988425&lt;br /&gt;
* Proakis: &amp;quot;Digital Signal Processing&amp;quot;, ISBN 0131873741&lt;br /&gt;
* Lyons: &amp;quot;Understanding Digital Signal Processing&amp;quot;, ISBN 0131089897&lt;br /&gt;
* Smith: &amp;quot;The Scientist and Engineer&#039;s Guide to Digital Signal Processing&amp;quot;, ISBN  075067444X (unter http://dspguide.com/ als PDF verfügbar)&lt;br /&gt;
* Sanjit K. Mitra: &amp;quot;Handbook for Digital Signal Processing&amp;quot; (1993,1312 Seiten), ISBN 0471619957&lt;br /&gt;
&lt;br /&gt;
=== Foren ===&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-10-1.html DSP-Forum auf mikrocontroller.net (deutsch)]&lt;br /&gt;
* [http://groups.google.de/group/comp.dsp Newsgroup comp.dsp (Englisch)]&lt;br /&gt;
* [http://www.dsprelated.com/groups.php Discussion Groups (Englisch)]&lt;br /&gt;
&lt;br /&gt;
=== Webseiten ===&lt;br /&gt;
* http://www.dspguru.com/ - FAQs, Infos, Beispielcode, ...&lt;br /&gt;
* http://docs.google.com/View?docid=dg2hppb_4gtgk89 - evtl. interessant als Rohmaterial für diesen Artikel&lt;br /&gt;
* http://www.dsprelated.com - Blogs, Jobs, Comp.DSP, ...&lt;br /&gt;
* http://www.unidsp56.de/ Eine Entwicklungsplattform für den Amateur&lt;br /&gt;
* http://de.wikipedia.org/wiki/Datei:Aircraft-recognition-and-tracking-by-dsp-based-signal-processing.jpg&lt;br /&gt;
&lt;br /&gt;
=== Artikel aus der Kategorie DSP ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ncl style=compact maxdepth=2 headings=bullet headstart=2&lt;br /&gt;
      showcats=1 showarts=1&amp;gt;DSP&amp;lt;/ncl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=66872</id>
		<title>Digitale Signalverarbeitung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=66872"/>
		<updated>2012-06-14T21:23:26Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* TI C6000 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Anwendungsgebiete ==&lt;br /&gt;
&lt;br /&gt;
* Modulation/Demodulation zur Datenübertragung (z.&amp;amp;nbsp;B. Telefonmodem, DSL, GSM) - &amp;quot;Software Defined Radio&amp;quot; (SDR)&lt;br /&gt;
* Multimediacodierung (MP3, DivX, JPEG)&lt;br /&gt;
* Bildverarbeitung (Bildverbesserung)&lt;br /&gt;
* Mustererkennung, Objekterkennung&lt;br /&gt;
* Echo- und Störgeräuschunterdrückung bei Telefonen, Sprechgarnituren (Headsets) und Hörgeräten&lt;br /&gt;
&lt;br /&gt;
== Verfahren ==&lt;br /&gt;
&lt;br /&gt;
=== FIR- und IIR-Filter ===&lt;br /&gt;
&lt;br /&gt;
Die häufigste Aufgabe in der DSV ist das Filtern, das heißt, bestimmte Frequenzanteile zu unterdrücken, zu verstärken oder in der Phase zu verschieben. Man kann grundsätzlich zwischen zwei Filterarten unterscheiden:&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;FIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;F&#039;&#039;&#039;inite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) wird jeder Ausgangswert aus der Summe unterschiedlich gewichteter Eingangswerte zusammengesetzt, die dazu in Schieberegistern vorgehalten werden. Dabei bezeichnet man die maximale Anzahl an Werten, die bei der Berechnung berücksichtigt werden, als &#039;&#039;&#039;Ordnung&#039;&#039;&#039; oder auch Filtertiefe. Je höher die Ordnungszahl, desto besser nähern sich die die Eigenschaften des realen Filters bez. ripple, Steilheit und z.B. Dämpfung an das theoretische Ideal an, desto höher ist aber auch der Rechenaufwand.&lt;br /&gt;
&lt;br /&gt;
Werden bei FIR-Filtern nur zurückliegende Werte verwendet, so handelt es sich um ein &amp;quot;look back&amp;quot; - Filter. Dieses ist typisch für real time Anwendungen. Werden auch Werte verwendet, die nach dem eigentlichen Bezugzeitpunkt liegen, spricht man von einem look ahead-Filter. Dieses kann naturgemäß nicht in Echtzeit angewendet werden, bzw die Ausgabezeitpunkte müssen um mindestens die halbe Filtertiefe verzögert werden.&lt;br /&gt;
&lt;br /&gt;
==== Merkmale von FIR-Filtern ====&lt;br /&gt;
* immer stabil&lt;br /&gt;
* linearer Phasengang -&amp;gt; keine Phasenverzerrungen&lt;br /&gt;
* Ordnungen oft im zwei- bis dreistelligen Bereich&lt;br /&gt;
* problemlos realisierbar!&lt;br /&gt;
&lt;br /&gt;
==== Beispiel ====&lt;br /&gt;
Seien D(0), D(1) ... D(t) die eingehenden Daten, so wäre Y(t) = 1/k * (D(t) + D(t-1) + D(t-2) + ... + (t-k)) ein einfaches FIR-Filter der Ordnung &amp;quot;k&amp;quot;, das als gleitender Mittelwert bezeichnet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu FIR-Filtern werden bei &#039;&#039;&#039;IIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;I&#039;&#039;&#039;nfinite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) auch frühere &#039;&#039;&#039;Ausgangs&#039;&#039;&#039;werte in die Berechnung des aktuellen Ausgangswertes mit einbezogen. Wie man sich leicht vorstellen kann, kann dadurch die Antwort auf einen Eingangsimpuls theoretisch unendlich lang werden, da jeder Ausgangswert auf den Eingang rückgekoppelt wird.&lt;br /&gt;
&lt;br /&gt;
====Merkmale von IIR-Filtern====&lt;br /&gt;
* durch Rundungsfehler kann das [[Filter]] instabil werden -&amp;gt; &amp;quot;Aufschaukeln&amp;quot; durch Rückkopplung -&amp;gt; schwierigere Realisierung&lt;br /&gt;
* kein linearer Phasengang -&amp;gt; verschiedene Frequenzanteile werden durch den Filter unterschiedlich lange verzögert -&amp;gt; &amp;quot;Verzerrung&amp;quot;&lt;br /&gt;
* einziger Vorteil gegenüber FIR: Um einen gewünschten Frequenzgang zu erzielen, ist eine sehr viel niedrigere Ordnung ausreichend -&amp;gt; weniger Rechenaufwand&lt;br /&gt;
* Ordnung üblicherweise &amp;lt; 10&lt;br /&gt;
&lt;br /&gt;
==== Beispiel====&lt;br /&gt;
Seien D(0), D(1) ... D(t) wieder die eingehenden Daten, wie oben, und Y(t-1) der um einen Berechungsschritt zeitlich verzögerte Wert des Filterwertes Y(t), dann wäre Y(t) = Y(t-1) * (1-k)  +  D(t) * k ein IIR-Filter erster Ordnung, wobei 1/k die Dämpfung und damit die Grenzfrequenz des Filters bestimmt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Viele nützliche Informationen zur Realisierung gibt es im [http://www.dspguru.com/info/faqs/ FIR- und IIR-FAQ auf dspguru.com] (der dort erwähnte Sourcecode FirAlgs.c kann [[Media:FirAlgs.c|hier]] direkt heruntergeladen werden).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Berechnungssoftware&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.filter-solutions.com/digital.html Beschreibung der Digitalfiltertypen], [http://www.nuhertz.com/download.html hier kostenlose Testversion Filter Free]&lt;br /&gt;
&lt;br /&gt;
=== DFT und FFT ===&lt;br /&gt;
&lt;br /&gt;
Die FFT (Fast Fourier Transform) ist ein schneller Algorithmus zur Berechnung der DFT (Discrete Fourier Transform). Damit bezeichnet man die Transformation eines Zeitsignals (= eine Abfolge von Samples) in den Frequenzbereich (= Frequenzbestandteile des Signals). Die Transformation kann auch ohne Verlust umgekehrt durchgeführt werden, also vom Frequenz- in den Zeitbereich (Inverse Discrete Fourier Transform, IDFT). Eine DFT wird praktisch immer mit dem FFT-Algorithmus realisiert, weshalb die Bezeichnungen FFT/DFT oft gleichwertig verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die offensichtlichste Anwendung der FFT ist die Darstellung des Frequenzspektrums eines Signals. Aber das ist nur ein kleiner Teil der Anwendungsmöglichkeiten. Viele Verarbeitungen lassen sich im Frequenzbereich einfacher durchführen als im Zeitbereich, z.&amp;amp;nbsp;B. Korrelationen oder sehr lange FIR-Filter. Das zu verarbeitende Signal wird dazu in den Frequenzbereich transformiert, dort manipuliert, und wieder in den Zeitbereich zurücktransformiert. Das klingt vielleicht umständlich, kann aber in der Praxis sehr viel schneller sein als eine Realisierung im Zeitbereich.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/25095 Diskussion: FFT auf dem AVR]&lt;br /&gt;
* [http://sourceforge.net/projects/kissfft/ Kiss FFT] - einfache FFT-Bibliothek, in C, Floating- und Fixed Point, BSD-Lizenz, geeignet für Mikrocontroller&lt;br /&gt;
* [http://www.fftw.org/ FFTW] - &#039;&#039;&#039;die&#039;&#039;&#039; Floating Point FFT-Bibliothek für PCs, GPL-Lizenz&lt;br /&gt;
*[http://www.sprut.de/electronic/pic/16bit/dsp/fft/fft.htm FFT - verständlich auch für Nichtakademiker (Deutsch)]&lt;br /&gt;
* [http://www.science.smith.edu/departments/Physics/fstaff/gfelder/ffteasy/ ffteasy - Einfache Routinen zur FFT]&lt;br /&gt;
&lt;br /&gt;
==== Goertzel-Algorithmus ====&lt;br /&gt;
&lt;br /&gt;
Liegt das Interesse bei der Berechnung einer DFT / FFT nur bei wenigen bestimmten Frequenz-Linien, so gibt es eine weniger rechenaufwendige Alternative mit diesem Algorithmus. Die Grenze, ab der Goertzel-Algo nicht mehr effektiv genug ist, liegt grob bei etwa 15% der Spektralfrequenzen.&lt;br /&gt;
&lt;br /&gt;
Das typische Anwendungsgebiet sind DTMF-Dekoder in Software.&lt;br /&gt;
Hierfür sind sogar die üblichen 8-bit-AVR-Controller ausreichend schnell.&lt;br /&gt;
&lt;br /&gt;
=== Signalerzeugung ===&lt;br /&gt;
&lt;br /&gt;
Für die Korrelation von Eingangssignalen mit zuvor ausgesendeten oder bekannten Signalformen zwecks Mustererkennung müssen oftmals eigenen Signale generiert werden.&lt;br /&gt;
&lt;br /&gt;
Rechteck-, Sägezahn- und Dreieckssignale lassen sich mit einfachen Zählern realisieren. &lt;br /&gt;
&lt;br /&gt;
Möchte man Sinus- oder beliebige andere Signalformen erzeugen, bietet es sich an, vorausberechnete Funktionswerte im Speicher abzulegen und der Reihe nach auszugeben. Eine variable Frequenzeinstellung kann man durch die Methode der Direkten Digitalen Synthese (&#039;&#039;&#039;DDS&#039;&#039;&#039;) realisieren.&lt;br /&gt;
&lt;br /&gt;
* [[Digitaler Funktionsgenerator]] - ausführliche Erklärung des Verfahrens im PDF, Beispielcode für AVR&lt;br /&gt;
* http://www.myplace.nu/avr/minidds/ - noch ein AVR-Projekt&lt;br /&gt;
* http://www.hit.bme.hu/~papay/sci/DDS/start.htm - noch eine Erklärung&lt;br /&gt;
&lt;br /&gt;
Eine weitere Methode zur Realisierung von (mehr oder weniger beliebigen) Funktionen ist die &#039;&#039;&#039;Polynomapproximation&#039;&#039;&#039;. Dabei nähert man die zu erzeugende Funktion durch ein Polynom an und verwendet das Horner-Schema, um die einzelnen Funktionswerte zu berechnen. Für ein Polynom der Ordnung N benötigt man damit pro Wert N+1 Multiplikationen (N ist üblicherweise &amp;lt;= 10).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Zur Entwicklung von Signalverarbeitungsverfahren gibt es eine ganze Reihe von Programmen. Neben kleinen Werkzeugen für den Filterentwurf und spezialisierten Bibliotheken zum Einbinden in eigene Programme existieren mehrere Mathematikprogramme, mit denen sich Signale verarbeiten und darstellen lassen. Die drei wichtigsten sind Matlab, Octave und Scilab.&lt;br /&gt;
&lt;br /&gt;
=== MATLAB ===&lt;br /&gt;
&lt;br /&gt;
MATLAB ist das Standardprogramm für numerische Mathematik. In der digitalen Signalverarbeitung wird es häufig verwendet, um einen Algorithmus vor der Umsetzung in C-Code oder auf einen DSP zu entwickeln und zu testen. Zum schon recht hohen Preis der Grundsoftware muss man noch einige hundert Euro für diverse Toolboxes einplanen (Signal Processing, Filter Design, Image Processing). Die [http://www.mikrocontroller.net/link/isbn/0979223903 Studentenversion] kostet ca. 80 Euro (die Signal Processing Toolbox und ein paar andere sind bereits enthalten).&lt;br /&gt;
&lt;br /&gt;
MATLAB ist für Windows, Linux, Mac OS X, Solaris und HP-UX erhältlich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://users.ece.gatech.edu/%7Ebonnie/book/TUTORIAL/tutorial.html - Englischsprachiges MATLAB-Tutorial&lt;br /&gt;
* http://www.mathworks.com/access/helpdesk/help/techdoc/matlab.shtml - MATLAB-Referenz&lt;br /&gt;
* http://www.eng.auburn.edu/~sjreeves/Classes/DSP/DSP.html - MATLAB for DSP (allgemeine Tipps und Hinweise)&lt;br /&gt;
&lt;br /&gt;
=== Octave ===&lt;br /&gt;
&lt;br /&gt;
Das Open-Source-Programm Octave zeichnet sich durch einen hohen Grad an Matlab-Kompatibilität aus; das geht so weit, dass man problemlos die Matlab-Online-Hilfe und Matlab-Einführungen zum Lernen verwenden kann. Im Zusatzpaket Octave-Forge sind auch viele Funktionen der Matlab-Toolboxes enthalten (z.&amp;amp;nbsp;B. Filterdesign, Signalverarbeitung). Octave ist ein reines Kommandozeilenprogramm, so dass man auf alle Annehmlichkeiten der Matlab-GUI verzichten muss. Zum Plotten wird gnuplot verwendet.&lt;br /&gt;
&lt;br /&gt;
Octave lässt sich auf praktisch jedem Unix-System kompilieren. Für Windows gibt es ein fertig kompiliertes Paket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://octave.sourceforge.net/ - Übersicht über alle Funktionen von Octave/Octave-Forge&lt;br /&gt;
&lt;br /&gt;
=== Scilab / Scicos ===&lt;br /&gt;
&lt;br /&gt;
Auch das Open-Source-Programmpaket Scilab / Scicos, ähnlich leistungsfähig wie Matlab und seine Zusatzmodule, ist kostenlos und im Quelltext erhältlich. Während die Grundsyntax (Kontrollstrukturen, Ausdrücke) weitgehend Matlab-kompatibel ist, gibt es bei den Funktionen z.T. deutliche Abweichungen. Dafür bietet Scilab / Scicos verglichen mit Octave umfangreichere Möglichkeiten zur grafischen Darstellung, die über das 2D- und 3D-Plotten von Funktionen weit hinausgehen, z.&amp;amp;nbsp;B. lassen sich Linien, Kreise usw. zeichnen.&lt;br /&gt;
&lt;br /&gt;
Scilab / Scicos läuft unter Windows, Linux/Unix und Mac OS X. Für die wichtigsten Linux-Distributionen sind fertige, komplette Binärpakete (RPM, ...) zur einfachen Installation frei verfügbar. Für Windows gibt es ebenfalls ein einfach zu installierendes Komplettpaket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scilab.org/ Scilab Homepage (Universelles Wissenschaftlich-Technisches Mathematik-Paket)]&lt;br /&gt;
* [http://www.scicos.org/ Scicos Homepage (Modellations- und Simulations-Paket für Scilab, ist im Scilab-Download enthalten)]&lt;br /&gt;
* [http://www-rocq.inria.fr/scicos/scicosmodnum.html ModNum Digital communication toolbox zu Scicos]&lt;br /&gt;
* [http://www.scilab.org/publications/index_publications.php?page=freebooks Übersicht zur Literatur: Webtexte, Bücher und Zeitschriftenartikel]&lt;br /&gt;
&#039;&#039;&#039;Bücher&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scicos.org/book.html Modeling and Simulation in Scilab/Scicos, (für Version 3.0, aktuell ist Version 4.1.2)]&lt;br /&gt;
&#039;&#039;&#039;Tutorials&#039;&#039;&#039;:&lt;br /&gt;
* [http://wiki.scilab.org/Tutorials?action=AttachFile&amp;amp;do=get&amp;amp;target=signal.pdf Signal Processing with Scilab (1998)], [http://wuarchive.wustl.edu/pub/aminet/misc/math/scilab-doc.lha Beispielfiles dazu lha-gepackt (1996)] [http://aminet.net/package/misc/math/scilab-doc oder hier], [http://viewvc.scilab.org/bin/cgi/viewvc.cgi/trunk/scilab_doc/signal/Nfigs_source/ hier auch einzeln erhältlich]&lt;br /&gt;
* [http://www.scilab.org/publications/delicado/scilab.pdf DSP-Tutorial in spanisch, teilweise aus dem englischen Tutorial entnommen]&lt;br /&gt;
* [http://www.neurotraces.com/scilab/scilab2/index.html Treatment of neurophysiological signals using Scilab, HTML-Texte mit Kapiteln zu Filtern, FFT usw.]&lt;br /&gt;
* [http://www.scilab.org/publications/TELECOM/ComNumSc.zip Digital-Kommunikation - französisches Tutorial, gezipptes Postscript]&lt;br /&gt;
* [http://www.mate.tue.nl/mate/pdfs/6827.pdf Beispielprojekt mit Vergleich SciCos und SciLab]&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ein DSP (&#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ignal &#039;&#039;&#039;P&#039;&#039;&#039;rocessor) ist eine spezielle CPU mit einem auf die Verarbeitung von Signalen optimierten Kern und Befehlssatz. Unterschieden wird hauptsächlich zwischen Gleitkomma- und Festkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
Charakteristisches Merkmal vieler DSPs ist eine VLIW-Architektur (&#039;&#039;&#039;V&#039;&#039;&#039;ery &#039;&#039;&#039;L&#039;&#039;&#039;ong &#039;&#039;&#039;I&#039;&#039;&#039;nstruction &#039;&#039;&#039;W&#039;&#039;&#039;ord). Dabei werden Anweisungen für mehrere parallele Ausführungseinheiten (Multiplizierer/Addierer/Akkumulatoren) und mehrere Lade-/Speicherbefehle in einem einzigen, langen Befehlswort kodiert, und in einem Takt ausgeführt. Dazu kommen häufig mehrere gleichzeitig adressierbare Speicherbänke, Unterstützung für Ringpuffer, Schleifen ohne Sprung-Overhead, Bit-Reverse-Adressierung (wichtig für FFT) und Arithmetik mit Sättigungs- statt Überlaufverhalten (wichtig für die Realisierung von IIR-Filtern).&lt;br /&gt;
&lt;br /&gt;
Seit ein paar Jahren beginnen die Grenzen zwischen Mikrocontrollern und DSPs etwas zu verschwimmen. Viele Mikrocontroller werden mit zusätzlichen DSP-Funktionen ausgestattet ([[PICCOLO]], [[dsPIC]], [[ARM]]), während DSPs zunehmend in Richtung der Aufgabenbereiche eines Mikrocontrollers oder Allround-Prozessors vordringen und immer öfter um Unterstützung für Betriebssysteme (MMU) oder I/O-Funktionen wie Ethernet oder USB erweitert werden ([[Blackfin]]).&lt;br /&gt;
&lt;br /&gt;
Eine noch größere DSP-Rechenleistung kann mit programmierbaren Logikbausteinen (&#039;&#039;&#039;[[FPGA]]&#039;&#039;&#039;s) erzielt werden, da die Anzahl gleichzeitig ausführbarer Rechenoperationen nur durch die Größe des FPGAs begrenzt wird. Nachteilig sind die gegenüber DSPs um ein vielfaches höheren Kosten, höherer Stromverbrauch und höherer Entwicklungsaufwand, weshalb FPGAs für Signalverarbeitung nur in sehr speziellen Anwendungen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aktuelle &#039;&#039;&#039;PC-Prozessoren&#039;&#039;&#039; sind sehr gut für Gleitkomma-Signalverarbeitung geeignet. Wenn keine besonderen Anforderungen an Echtzeitfähigkeit, Strom- oder Platzbedarf gestellt werden, hat ein normaler PC mit Abstand das beste Preis/Leistungsverhältnis. Der erste Schritt bei einem DSP-Projekt sollte somit eine Implementierung auf dem PC sein. Es macht wenig Sinn, ein Eval-Board für einen Signalprozessor zu kaufen und einfach loszulegen.&lt;br /&gt;
&lt;br /&gt;
=== Fest- oder Gleitkomma? ===&lt;br /&gt;
&lt;br /&gt;
Signalverarbeitung auf einem Gleitkomma- (Floating-Point-) Rechner ist grundsätzlich einfacher als auf einem Festkomma- (Fixed-Point-) Rechner. Da die Ungenauigkeiten bei der Rechnung mit Floating-Point-Zahlen in vielen Fällen vernachlässigbar sind, kann man einen Algorithmus i.d.R. 1:1 in Programmcode umsetzen. Hat man nur Festkomma-Rechenoperationen zur Verfügung wird es etwas ungemütlich. Man muss sich Gedanken um die Skalierung der Daten, die Reihenfolge von Rechenoperationen, Überläufe, Rundungsrauschen usw. machen. Da Gleitkomma-DSPs allerdings teurer sind und mehr Strom verbrauchen, werden für Massenprodukte fast ausschließlich Festkomma-DSPs bzw. ASICs mit Festkomma-Rechenwerken verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TI C2000 ===&lt;br /&gt;
&lt;br /&gt;
Eine komplette 32-bit DSC Controller Familie vom low-cost ([http://www.ti.com/corp/docs/landing/f280xx-piccolo/index.htm PICCOLO]) bis high-end Controller mit FPU ([http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=mcu&amp;amp;sectionId=95&amp;amp;tabId=2108&amp;amp;familyId=1414&amp;amp;paramCriteria=no TMS320F28335]).&lt;br /&gt;
Die Peripherie umfasst Mehrkanal A/D Wandler mit 12-bit Aufloesung und bis zu 4 Megasamples Abtastrate. Die PWMs haben einen hochauflösenden Modus, der bis zu 150ps auflösen kann. Als Interface stehen CAN, I2C, schnelle generelle serielle Ports und Quadratureingänge für Drehgeber zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== TI C5000 ===&lt;br /&gt;
&lt;br /&gt;
DSP für batteriebetriebene Anwendungen. Die gesamte Architektur wurde auf Stromverbrauch optimiert. Dazu werden spezielle Werkzeuge zur Verfügung gestellt, die zur Anwendung passende Optimierungslösungen generiert. [[TMS320VC5505 eZDSP USB Stick‎]] mit IDE als preisgünstiges Entwicklungssystem ( &amp;lt; 50€)&lt;br /&gt;
&lt;br /&gt;
=== TI C6000 ===&lt;br /&gt;
&lt;br /&gt;
DSP-Familie vom Marktführer Texas Instruments enthält sowohl Fest- als auch Gleitkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
=== TI DM6400 (DaVinci) ===&lt;br /&gt;
&lt;br /&gt;
DSP für Videoanwendungen. Einige Derivate enthalten auch einen ARM9 als Co-Prozessor. Diese Familie wird unter dem Namen [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=dsp&amp;amp;sectionId=2&amp;amp;tabId=1852&amp;amp;familyId=1300 DaVinci] vermarktet.&lt;br /&gt;
&lt;br /&gt;
=== TI OMAP ===&lt;br /&gt;
&lt;br /&gt;
Prozessor für mobile Geräte, enthält einen ARM-Kern und einen C6000-DSP. Ein interessantes und mit $149 sehr preisgünstiges Evalboard ist das [http://www.beagleboard.org Beagle Board]. Ein kostenloser Assembler für den DSP ist verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== SHARC/TigerSHARC ===&lt;br /&gt;
&lt;br /&gt;
32 Bit Gleitkomma-DSP von Analog Devices.&lt;br /&gt;
&lt;br /&gt;
=== Blackfin ===&lt;br /&gt;
&lt;br /&gt;
Der Blackfin ist ein 16/32 Bit Festkomma-DSP von Analog Devices. Im Gegensatz zu den 16-bittigen Vorgängern ADSP-21xx, die häufig als Co-Prozessoren zur Signalverarbeitung zusammen mit einem Mikrocontroller verwendet werden, geht der Blackfin schon weit in den Einsatzbereich eines Allround-Prozessors hinein. So gibt es z.&amp;amp;nbsp;B. einen Linux-Port für Blackfin, Eval-Boards mit Ethernet, CAN, USB und vielen MB SDRAM. Dank der verbesserten Stromsparfunktionen der BF52x-Reihe ist diese eher neue Architektur vermehrt in mobilen Geräten (Kameras, Mediaplayer, etc.) anzutreffen.&lt;br /&gt;
&lt;br /&gt;
Wichtig für die Entwicklung ist zu wissen:&lt;br /&gt;
&lt;br /&gt;
* Kein Fließkomma-Support in Hardware&lt;br /&gt;
* Keine MMU, keine Unterstützung für virtuelles Memory (kein Unix fork(), etc.)&lt;br /&gt;
&lt;br /&gt;
Unterstützte Entwicklungswerkzeuge:&lt;br /&gt;
&lt;br /&gt;
* Visual DSP++: Hauseigenes Entwicklungstool von Analog Devices, kommerziell&lt;br /&gt;
* GCC: Freie GNU-Umgebung mit Assembler, Compiler, Linker, Debugger&lt;br /&gt;
* Eclipse für uClinux-Entwicklung wie auch &#039;standalone&#039; ohne OS&lt;br /&gt;
&lt;br /&gt;
Aufgrund der ausgereiften GNU-Toolchain ist der Blackfin eine der kostengünstigsten Plattformen für die Entwicklung. Die Tools laufen sowohl unter Windows32 als auch Linux, bevorzugt wird jedoch Linux eingesetzt. Für die Kernel-Entwicklung ist Linux unabdingbar.&lt;br /&gt;
Dank offener JTAG-Spezifikation existieren einige Tools von Drittherstellern zum Hardware-Debugging (In Circuit Emulation) und zur Programmierung:&lt;br /&gt;
&lt;br /&gt;
* [http://www.section5.ch/icebear ICEbear] JTAG: schneller USB-&amp;gt;JTAG adapter&lt;br /&gt;
* [http://www.ronetix.at/ PEEDI] High end JTAG, Ethernet&lt;br /&gt;
* [http://www.bluetechnix.at/rainbow2006/site/blackfin_family/__dev_tools/__gnice_jtag/409/gnice_jtag.aspx gnICE von Bluetechnix]&lt;br /&gt;
* [http://www.analog.com/en/processors-dsp/blackfin/emulator-100/processors/product.html JTAG-Adapter von Analog Devices]&lt;br /&gt;
&lt;br /&gt;
Beide Tools arbeiten auch mit ARM-Prozessoren.&lt;br /&gt;
&lt;br /&gt;
Weitere Links:&lt;br /&gt;
&lt;br /&gt;
* [http://www.bluetechnix.com/rainbow2006/default.aspx Bluetechnix Core-Module]&lt;br /&gt;
* [http://www.analog.com/blackfin Herstellerwebsite]&lt;br /&gt;
* [http://blackfin.uclinux.org/ uClinux Port und GNU toolchain]&lt;br /&gt;
&lt;br /&gt;
=== dsPIC ===&lt;br /&gt;
&lt;br /&gt;
Der [[dsPIC]] ist ein kleiner 16 Bit-Mikrocontroller mit DSP-Funktionen. Mit dem klassischen 8Bit-PIC hat er außer dem Namen nichts gemeinsam.&lt;br /&gt;
&lt;br /&gt;
Er basiert auf der modernen RISC-Architektur des PIC24 und bietet zusätzlich 40Bit Register und spezielle Befehle für DSP-Anwendungen. Der derzeit schnellste dsPIC33E arbeitet mit bis zu 70MIPS. dsPIC33 gibt es sogar im DIL28-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
Ein kostenloser C-Compiler (C30) und eine DSP-Bibliothek wird von Microchip angeboten. Dabei handelt es sich um eine &amp;quot;Lite&amp;quot;-Version des kommerziellen C30, bei dem nur eine Optimierungsstufe freigeschaltet ist, aber ansonsten keine Einschränkungen (Codegröße o.ä.) bestehen.&lt;br /&gt;
&lt;br /&gt;
=== TriCore ===&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;TriCore&#039;&#039;&#039; von Infineon ist ein 32-Bit-Mikrocontroller mit DSP-Funktionen, mit derzeitigem Schwerpunkt im Bereich der High Performance Embedded Real-Time Systems für Industrie-  und Automobilanwendungen (Beispiele: Motorsteuerungen, Servomotoren, Solarinverter, Multi-Axis-Conrol) &lt;br /&gt;
&lt;br /&gt;
* [http://www.infineon.com/cgi-bin/ifx/portal/ep/channelView.do?channelId=-78991&amp;amp;channelPage=%2Fep%2Fchannel%2FleafNote.jsp&amp;amp;pageTypeId=17099  Übersicht über die &#039;&#039;&#039;TriCore&#039;&#039;&#039; Produktfamilie]&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen für Starterkits/Evalboards ===&lt;br /&gt;
&lt;br /&gt;
* http://www.spectrumdigital.com - große Auswahl an Starterkits mit TI-DSPs, ab $300&lt;br /&gt;
* http://www.bluetechnix.com - Blackfin-Module ab € 150&lt;br /&gt;
* http://www.zbrain.ch/ - Blackfin-Modul, Preis: ?&lt;br /&gt;
* http://www.danvillesignal.com/ - ADSP-218x-Boards ab $200, Sharc-Boards ab $400&lt;br /&gt;
* http://docs.blackfin.uclinux.org/doku.php?id=buy_stuff - Blackfin BF533 STAMP $170 (keine analogen Schnittstellen, aber über Pfostenstecker leicht zu erweitern)&lt;br /&gt;
* http://www.sundance.com - High-End-Module mit TI C6000&lt;br /&gt;
* http://www.spectrumsignal.com/ - TMS320 und SHARC&lt;br /&gt;
* http://www.pentek.com/dspcentral/ - TMS430 und PowerPC&lt;br /&gt;
* http://www.bittware.com/ - SHARC und TigerSHARC&lt;br /&gt;
* http://www.hunteng.co.uk/ - C6000&lt;br /&gt;
* http://www.kanecomputing.co.uk&lt;br /&gt;
* http://www.dsp-systeme.net - DSP-Module mit DSP von TI und ADI&lt;br /&gt;
* http://search.digikey.com/scripts/DkSearch/dksus.dll?lang=de&amp;amp;site=DE&amp;amp;WT.z_homepage_link=hp_go_button&amp;amp;KeyWords=TMDX5505EZDSP&amp;amp;x=22&amp;amp;y=22  eZDSP  USB Stick , &amp;lt;50€&lt;br /&gt;
* http://www.dsp-weuffen.de  - TI C6727 Board und vielen Beispielen&lt;br /&gt;
* http://www.ehitex.de/artikel.php?xPD=131_132&amp;amp;kat_name= - Infineon TriCore Starter Kits&lt;br /&gt;
&lt;br /&gt;
== Weitere Infos==&lt;br /&gt;
&lt;br /&gt;
===Literatur ===&lt;br /&gt;
* Oppenheim, Schaefer: &amp;quot;Discrete Time Signal Processing&amp;quot;, ISBN 0131988425&lt;br /&gt;
* Proakis: &amp;quot;Digital Signal Processing&amp;quot;, ISBN 0131873741&lt;br /&gt;
* Lyons: &amp;quot;Understanding Digital Signal Processing&amp;quot;, ISBN 0131089897&lt;br /&gt;
* Smith: &amp;quot;The Scientist and Engineer&#039;s Guide to Digital Signal Processing&amp;quot;, ISBN  075067444X (unter http://dspguide.com/ als PDF verfügbar)&lt;br /&gt;
* Sanjit K. Mitra: &amp;quot;Handbook for Digital Signal Processing&amp;quot; (1993,1312 Seiten), ISBN 0471619957&lt;br /&gt;
&lt;br /&gt;
=== Foren ===&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-10-1.html DSP-Forum auf mikrocontroller.net (deutsch)]&lt;br /&gt;
* [http://groups.google.de/group/comp.dsp Newsgroup comp.dsp (Englisch)]&lt;br /&gt;
* [http://www.dsprelated.com/groups.php Discussion Groups (Englisch)]&lt;br /&gt;
&lt;br /&gt;
=== Webseiten ===&lt;br /&gt;
* http://www.dspguru.com/ - FAQs, Infos, Beispielcode, ...&lt;br /&gt;
* http://docs.google.com/View?docid=dg2hppb_4gtgk89 - evtl. interessant als Rohmaterial für diesen Artikel&lt;br /&gt;
* http://www.dsprelated.com - Blogs, Jobs, Comp.DSP, ...&lt;br /&gt;
* http://www.unidsp56.de/ Eine Entwicklungsplattform für den Amateur&lt;br /&gt;
* http://de.wikipedia.org/wiki/Datei:Aircraft-recognition-and-tracking-by-dsp-based-signal-processing.jpg&lt;br /&gt;
&lt;br /&gt;
=== Artikel aus der Kategorie DSP ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ncl style=compact maxdepth=2 headings=bullet headstart=2&lt;br /&gt;
      showcats=1 showarts=1&amp;gt;DSP&amp;lt;/ncl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=66871</id>
		<title>Digitale Signalverarbeitung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=66871"/>
		<updated>2012-06-14T21:23:03Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* TI C5000 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Anwendungsgebiete ==&lt;br /&gt;
&lt;br /&gt;
* Modulation/Demodulation zur Datenübertragung (z.&amp;amp;nbsp;B. Telefonmodem, DSL, GSM) - &amp;quot;Software Defined Radio&amp;quot; (SDR)&lt;br /&gt;
* Multimediacodierung (MP3, DivX, JPEG)&lt;br /&gt;
* Bildverarbeitung (Bildverbesserung)&lt;br /&gt;
* Mustererkennung, Objekterkennung&lt;br /&gt;
* Echo- und Störgeräuschunterdrückung bei Telefonen, Sprechgarnituren (Headsets) und Hörgeräten&lt;br /&gt;
&lt;br /&gt;
== Verfahren ==&lt;br /&gt;
&lt;br /&gt;
=== FIR- und IIR-Filter ===&lt;br /&gt;
&lt;br /&gt;
Die häufigste Aufgabe in der DSV ist das Filtern, das heißt, bestimmte Frequenzanteile zu unterdrücken, zu verstärken oder in der Phase zu verschieben. Man kann grundsätzlich zwischen zwei Filterarten unterscheiden:&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;FIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;F&#039;&#039;&#039;inite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) wird jeder Ausgangswert aus der Summe unterschiedlich gewichteter Eingangswerte zusammengesetzt, die dazu in Schieberegistern vorgehalten werden. Dabei bezeichnet man die maximale Anzahl an Werten, die bei der Berechnung berücksichtigt werden, als &#039;&#039;&#039;Ordnung&#039;&#039;&#039; oder auch Filtertiefe. Je höher die Ordnungszahl, desto besser nähern sich die die Eigenschaften des realen Filters bez. ripple, Steilheit und z.B. Dämpfung an das theoretische Ideal an, desto höher ist aber auch der Rechenaufwand.&lt;br /&gt;
&lt;br /&gt;
Werden bei FIR-Filtern nur zurückliegende Werte verwendet, so handelt es sich um ein &amp;quot;look back&amp;quot; - Filter. Dieses ist typisch für real time Anwendungen. Werden auch Werte verwendet, die nach dem eigentlichen Bezugzeitpunkt liegen, spricht man von einem look ahead-Filter. Dieses kann naturgemäß nicht in Echtzeit angewendet werden, bzw die Ausgabezeitpunkte müssen um mindestens die halbe Filtertiefe verzögert werden.&lt;br /&gt;
&lt;br /&gt;
==== Merkmale von FIR-Filtern ====&lt;br /&gt;
* immer stabil&lt;br /&gt;
* linearer Phasengang -&amp;gt; keine Phasenverzerrungen&lt;br /&gt;
* Ordnungen oft im zwei- bis dreistelligen Bereich&lt;br /&gt;
* problemlos realisierbar!&lt;br /&gt;
&lt;br /&gt;
==== Beispiel ====&lt;br /&gt;
Seien D(0), D(1) ... D(t) die eingehenden Daten, so wäre Y(t) = 1/k * (D(t) + D(t-1) + D(t-2) + ... + (t-k)) ein einfaches FIR-Filter der Ordnung &amp;quot;k&amp;quot;, das als gleitender Mittelwert bezeichnet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu FIR-Filtern werden bei &#039;&#039;&#039;IIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;I&#039;&#039;&#039;nfinite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) auch frühere &#039;&#039;&#039;Ausgangs&#039;&#039;&#039;werte in die Berechnung des aktuellen Ausgangswertes mit einbezogen. Wie man sich leicht vorstellen kann, kann dadurch die Antwort auf einen Eingangsimpuls theoretisch unendlich lang werden, da jeder Ausgangswert auf den Eingang rückgekoppelt wird.&lt;br /&gt;
&lt;br /&gt;
====Merkmale von IIR-Filtern====&lt;br /&gt;
* durch Rundungsfehler kann das [[Filter]] instabil werden -&amp;gt; &amp;quot;Aufschaukeln&amp;quot; durch Rückkopplung -&amp;gt; schwierigere Realisierung&lt;br /&gt;
* kein linearer Phasengang -&amp;gt; verschiedene Frequenzanteile werden durch den Filter unterschiedlich lange verzögert -&amp;gt; &amp;quot;Verzerrung&amp;quot;&lt;br /&gt;
* einziger Vorteil gegenüber FIR: Um einen gewünschten Frequenzgang zu erzielen, ist eine sehr viel niedrigere Ordnung ausreichend -&amp;gt; weniger Rechenaufwand&lt;br /&gt;
* Ordnung üblicherweise &amp;lt; 10&lt;br /&gt;
&lt;br /&gt;
==== Beispiel====&lt;br /&gt;
Seien D(0), D(1) ... D(t) wieder die eingehenden Daten, wie oben, und Y(t-1) der um einen Berechungsschritt zeitlich verzögerte Wert des Filterwertes Y(t), dann wäre Y(t) = Y(t-1) * (1-k)  +  D(t) * k ein IIR-Filter erster Ordnung, wobei 1/k die Dämpfung und damit die Grenzfrequenz des Filters bestimmt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Viele nützliche Informationen zur Realisierung gibt es im [http://www.dspguru.com/info/faqs/ FIR- und IIR-FAQ auf dspguru.com] (der dort erwähnte Sourcecode FirAlgs.c kann [[Media:FirAlgs.c|hier]] direkt heruntergeladen werden).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Berechnungssoftware&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.filter-solutions.com/digital.html Beschreibung der Digitalfiltertypen], [http://www.nuhertz.com/download.html hier kostenlose Testversion Filter Free]&lt;br /&gt;
&lt;br /&gt;
=== DFT und FFT ===&lt;br /&gt;
&lt;br /&gt;
Die FFT (Fast Fourier Transform) ist ein schneller Algorithmus zur Berechnung der DFT (Discrete Fourier Transform). Damit bezeichnet man die Transformation eines Zeitsignals (= eine Abfolge von Samples) in den Frequenzbereich (= Frequenzbestandteile des Signals). Die Transformation kann auch ohne Verlust umgekehrt durchgeführt werden, also vom Frequenz- in den Zeitbereich (Inverse Discrete Fourier Transform, IDFT). Eine DFT wird praktisch immer mit dem FFT-Algorithmus realisiert, weshalb die Bezeichnungen FFT/DFT oft gleichwertig verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die offensichtlichste Anwendung der FFT ist die Darstellung des Frequenzspektrums eines Signals. Aber das ist nur ein kleiner Teil der Anwendungsmöglichkeiten. Viele Verarbeitungen lassen sich im Frequenzbereich einfacher durchführen als im Zeitbereich, z.&amp;amp;nbsp;B. Korrelationen oder sehr lange FIR-Filter. Das zu verarbeitende Signal wird dazu in den Frequenzbereich transformiert, dort manipuliert, und wieder in den Zeitbereich zurücktransformiert. Das klingt vielleicht umständlich, kann aber in der Praxis sehr viel schneller sein als eine Realisierung im Zeitbereich.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/25095 Diskussion: FFT auf dem AVR]&lt;br /&gt;
* [http://sourceforge.net/projects/kissfft/ Kiss FFT] - einfache FFT-Bibliothek, in C, Floating- und Fixed Point, BSD-Lizenz, geeignet für Mikrocontroller&lt;br /&gt;
* [http://www.fftw.org/ FFTW] - &#039;&#039;&#039;die&#039;&#039;&#039; Floating Point FFT-Bibliothek für PCs, GPL-Lizenz&lt;br /&gt;
*[http://www.sprut.de/electronic/pic/16bit/dsp/fft/fft.htm FFT - verständlich auch für Nichtakademiker (Deutsch)]&lt;br /&gt;
* [http://www.science.smith.edu/departments/Physics/fstaff/gfelder/ffteasy/ ffteasy - Einfache Routinen zur FFT]&lt;br /&gt;
&lt;br /&gt;
==== Goertzel-Algorithmus ====&lt;br /&gt;
&lt;br /&gt;
Liegt das Interesse bei der Berechnung einer DFT / FFT nur bei wenigen bestimmten Frequenz-Linien, so gibt es eine weniger rechenaufwendige Alternative mit diesem Algorithmus. Die Grenze, ab der Goertzel-Algo nicht mehr effektiv genug ist, liegt grob bei etwa 15% der Spektralfrequenzen.&lt;br /&gt;
&lt;br /&gt;
Das typische Anwendungsgebiet sind DTMF-Dekoder in Software.&lt;br /&gt;
Hierfür sind sogar die üblichen 8-bit-AVR-Controller ausreichend schnell.&lt;br /&gt;
&lt;br /&gt;
=== Signalerzeugung ===&lt;br /&gt;
&lt;br /&gt;
Für die Korrelation von Eingangssignalen mit zuvor ausgesendeten oder bekannten Signalformen zwecks Mustererkennung müssen oftmals eigenen Signale generiert werden.&lt;br /&gt;
&lt;br /&gt;
Rechteck-, Sägezahn- und Dreieckssignale lassen sich mit einfachen Zählern realisieren. &lt;br /&gt;
&lt;br /&gt;
Möchte man Sinus- oder beliebige andere Signalformen erzeugen, bietet es sich an, vorausberechnete Funktionswerte im Speicher abzulegen und der Reihe nach auszugeben. Eine variable Frequenzeinstellung kann man durch die Methode der Direkten Digitalen Synthese (&#039;&#039;&#039;DDS&#039;&#039;&#039;) realisieren.&lt;br /&gt;
&lt;br /&gt;
* [[Digitaler Funktionsgenerator]] - ausführliche Erklärung des Verfahrens im PDF, Beispielcode für AVR&lt;br /&gt;
* http://www.myplace.nu/avr/minidds/ - noch ein AVR-Projekt&lt;br /&gt;
* http://www.hit.bme.hu/~papay/sci/DDS/start.htm - noch eine Erklärung&lt;br /&gt;
&lt;br /&gt;
Eine weitere Methode zur Realisierung von (mehr oder weniger beliebigen) Funktionen ist die &#039;&#039;&#039;Polynomapproximation&#039;&#039;&#039;. Dabei nähert man die zu erzeugende Funktion durch ein Polynom an und verwendet das Horner-Schema, um die einzelnen Funktionswerte zu berechnen. Für ein Polynom der Ordnung N benötigt man damit pro Wert N+1 Multiplikationen (N ist üblicherweise &amp;lt;= 10).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Zur Entwicklung von Signalverarbeitungsverfahren gibt es eine ganze Reihe von Programmen. Neben kleinen Werkzeugen für den Filterentwurf und spezialisierten Bibliotheken zum Einbinden in eigene Programme existieren mehrere Mathematikprogramme, mit denen sich Signale verarbeiten und darstellen lassen. Die drei wichtigsten sind Matlab, Octave und Scilab.&lt;br /&gt;
&lt;br /&gt;
=== MATLAB ===&lt;br /&gt;
&lt;br /&gt;
MATLAB ist das Standardprogramm für numerische Mathematik. In der digitalen Signalverarbeitung wird es häufig verwendet, um einen Algorithmus vor der Umsetzung in C-Code oder auf einen DSP zu entwickeln und zu testen. Zum schon recht hohen Preis der Grundsoftware muss man noch einige hundert Euro für diverse Toolboxes einplanen (Signal Processing, Filter Design, Image Processing). Die [http://www.mikrocontroller.net/link/isbn/0979223903 Studentenversion] kostet ca. 80 Euro (die Signal Processing Toolbox und ein paar andere sind bereits enthalten).&lt;br /&gt;
&lt;br /&gt;
MATLAB ist für Windows, Linux, Mac OS X, Solaris und HP-UX erhältlich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://users.ece.gatech.edu/%7Ebonnie/book/TUTORIAL/tutorial.html - Englischsprachiges MATLAB-Tutorial&lt;br /&gt;
* http://www.mathworks.com/access/helpdesk/help/techdoc/matlab.shtml - MATLAB-Referenz&lt;br /&gt;
* http://www.eng.auburn.edu/~sjreeves/Classes/DSP/DSP.html - MATLAB for DSP (allgemeine Tipps und Hinweise)&lt;br /&gt;
&lt;br /&gt;
=== Octave ===&lt;br /&gt;
&lt;br /&gt;
Das Open-Source-Programm Octave zeichnet sich durch einen hohen Grad an Matlab-Kompatibilität aus; das geht so weit, dass man problemlos die Matlab-Online-Hilfe und Matlab-Einführungen zum Lernen verwenden kann. Im Zusatzpaket Octave-Forge sind auch viele Funktionen der Matlab-Toolboxes enthalten (z.&amp;amp;nbsp;B. Filterdesign, Signalverarbeitung). Octave ist ein reines Kommandozeilenprogramm, so dass man auf alle Annehmlichkeiten der Matlab-GUI verzichten muss. Zum Plotten wird gnuplot verwendet.&lt;br /&gt;
&lt;br /&gt;
Octave lässt sich auf praktisch jedem Unix-System kompilieren. Für Windows gibt es ein fertig kompiliertes Paket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://octave.sourceforge.net/ - Übersicht über alle Funktionen von Octave/Octave-Forge&lt;br /&gt;
&lt;br /&gt;
=== Scilab / Scicos ===&lt;br /&gt;
&lt;br /&gt;
Auch das Open-Source-Programmpaket Scilab / Scicos, ähnlich leistungsfähig wie Matlab und seine Zusatzmodule, ist kostenlos und im Quelltext erhältlich. Während die Grundsyntax (Kontrollstrukturen, Ausdrücke) weitgehend Matlab-kompatibel ist, gibt es bei den Funktionen z.T. deutliche Abweichungen. Dafür bietet Scilab / Scicos verglichen mit Octave umfangreichere Möglichkeiten zur grafischen Darstellung, die über das 2D- und 3D-Plotten von Funktionen weit hinausgehen, z.&amp;amp;nbsp;B. lassen sich Linien, Kreise usw. zeichnen.&lt;br /&gt;
&lt;br /&gt;
Scilab / Scicos läuft unter Windows, Linux/Unix und Mac OS X. Für die wichtigsten Linux-Distributionen sind fertige, komplette Binärpakete (RPM, ...) zur einfachen Installation frei verfügbar. Für Windows gibt es ebenfalls ein einfach zu installierendes Komplettpaket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scilab.org/ Scilab Homepage (Universelles Wissenschaftlich-Technisches Mathematik-Paket)]&lt;br /&gt;
* [http://www.scicos.org/ Scicos Homepage (Modellations- und Simulations-Paket für Scilab, ist im Scilab-Download enthalten)]&lt;br /&gt;
* [http://www-rocq.inria.fr/scicos/scicosmodnum.html ModNum Digital communication toolbox zu Scicos]&lt;br /&gt;
* [http://www.scilab.org/publications/index_publications.php?page=freebooks Übersicht zur Literatur: Webtexte, Bücher und Zeitschriftenartikel]&lt;br /&gt;
&#039;&#039;&#039;Bücher&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scicos.org/book.html Modeling and Simulation in Scilab/Scicos, (für Version 3.0, aktuell ist Version 4.1.2)]&lt;br /&gt;
&#039;&#039;&#039;Tutorials&#039;&#039;&#039;:&lt;br /&gt;
* [http://wiki.scilab.org/Tutorials?action=AttachFile&amp;amp;do=get&amp;amp;target=signal.pdf Signal Processing with Scilab (1998)], [http://wuarchive.wustl.edu/pub/aminet/misc/math/scilab-doc.lha Beispielfiles dazu lha-gepackt (1996)] [http://aminet.net/package/misc/math/scilab-doc oder hier], [http://viewvc.scilab.org/bin/cgi/viewvc.cgi/trunk/scilab_doc/signal/Nfigs_source/ hier auch einzeln erhältlich]&lt;br /&gt;
* [http://www.scilab.org/publications/delicado/scilab.pdf DSP-Tutorial in spanisch, teilweise aus dem englischen Tutorial entnommen]&lt;br /&gt;
* [http://www.neurotraces.com/scilab/scilab2/index.html Treatment of neurophysiological signals using Scilab, HTML-Texte mit Kapiteln zu Filtern, FFT usw.]&lt;br /&gt;
* [http://www.scilab.org/publications/TELECOM/ComNumSc.zip Digital-Kommunikation - französisches Tutorial, gezipptes Postscript]&lt;br /&gt;
* [http://www.mate.tue.nl/mate/pdfs/6827.pdf Beispielprojekt mit Vergleich SciCos und SciLab]&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ein DSP (&#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ignal &#039;&#039;&#039;P&#039;&#039;&#039;rocessor) ist eine spezielle CPU mit einem auf die Verarbeitung von Signalen optimierten Kern und Befehlssatz. Unterschieden wird hauptsächlich zwischen Gleitkomma- und Festkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
Charakteristisches Merkmal vieler DSPs ist eine VLIW-Architektur (&#039;&#039;&#039;V&#039;&#039;&#039;ery &#039;&#039;&#039;L&#039;&#039;&#039;ong &#039;&#039;&#039;I&#039;&#039;&#039;nstruction &#039;&#039;&#039;W&#039;&#039;&#039;ord). Dabei werden Anweisungen für mehrere parallele Ausführungseinheiten (Multiplizierer/Addierer/Akkumulatoren) und mehrere Lade-/Speicherbefehle in einem einzigen, langen Befehlswort kodiert, und in einem Takt ausgeführt. Dazu kommen häufig mehrere gleichzeitig adressierbare Speicherbänke, Unterstützung für Ringpuffer, Schleifen ohne Sprung-Overhead, Bit-Reverse-Adressierung (wichtig für FFT) und Arithmetik mit Sättigungs- statt Überlaufverhalten (wichtig für die Realisierung von IIR-Filtern).&lt;br /&gt;
&lt;br /&gt;
Seit ein paar Jahren beginnen die Grenzen zwischen Mikrocontrollern und DSPs etwas zu verschwimmen. Viele Mikrocontroller werden mit zusätzlichen DSP-Funktionen ausgestattet ([[PICCOLO]], [[dsPIC]], [[ARM]]), während DSPs zunehmend in Richtung der Aufgabenbereiche eines Mikrocontrollers oder Allround-Prozessors vordringen und immer öfter um Unterstützung für Betriebssysteme (MMU) oder I/O-Funktionen wie Ethernet oder USB erweitert werden ([[Blackfin]]).&lt;br /&gt;
&lt;br /&gt;
Eine noch größere DSP-Rechenleistung kann mit programmierbaren Logikbausteinen (&#039;&#039;&#039;[[FPGA]]&#039;&#039;&#039;s) erzielt werden, da die Anzahl gleichzeitig ausführbarer Rechenoperationen nur durch die Größe des FPGAs begrenzt wird. Nachteilig sind die gegenüber DSPs um ein vielfaches höheren Kosten, höherer Stromverbrauch und höherer Entwicklungsaufwand, weshalb FPGAs für Signalverarbeitung nur in sehr speziellen Anwendungen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aktuelle &#039;&#039;&#039;PC-Prozessoren&#039;&#039;&#039; sind sehr gut für Gleitkomma-Signalverarbeitung geeignet. Wenn keine besonderen Anforderungen an Echtzeitfähigkeit, Strom- oder Platzbedarf gestellt werden, hat ein normaler PC mit Abstand das beste Preis/Leistungsverhältnis. Der erste Schritt bei einem DSP-Projekt sollte somit eine Implementierung auf dem PC sein. Es macht wenig Sinn, ein Eval-Board für einen Signalprozessor zu kaufen und einfach loszulegen.&lt;br /&gt;
&lt;br /&gt;
=== Fest- oder Gleitkomma? ===&lt;br /&gt;
&lt;br /&gt;
Signalverarbeitung auf einem Gleitkomma- (Floating-Point-) Rechner ist grundsätzlich einfacher als auf einem Festkomma- (Fixed-Point-) Rechner. Da die Ungenauigkeiten bei der Rechnung mit Floating-Point-Zahlen in vielen Fällen vernachlässigbar sind, kann man einen Algorithmus i.d.R. 1:1 in Programmcode umsetzen. Hat man nur Festkomma-Rechenoperationen zur Verfügung wird es etwas ungemütlich. Man muss sich Gedanken um die Skalierung der Daten, die Reihenfolge von Rechenoperationen, Überläufe, Rundungsrauschen usw. machen. Da Gleitkomma-DSPs allerdings teurer sind und mehr Strom verbrauchen, werden für Massenprodukte fast ausschließlich Festkomma-DSPs bzw. ASICs mit Festkomma-Rechenwerken verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TI C2000 ===&lt;br /&gt;
&lt;br /&gt;
Eine komplette 32-bit DSC Controller Familie vom low-cost ([http://www.ti.com/corp/docs/landing/f280xx-piccolo/index.htm PICCOLO]) bis high-end Controller mit FPU ([http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=mcu&amp;amp;sectionId=95&amp;amp;tabId=2108&amp;amp;familyId=1414&amp;amp;paramCriteria=no TMS320F28335]).&lt;br /&gt;
Die Peripherie umfasst Mehrkanal A/D Wandler mit 12-bit Aufloesung und bis zu 4 Megasamples Abtastrate. Die PWMs haben einen hochauflösenden Modus, der bis zu 150ps auflösen kann. Als Interface stehen CAN, I2C, schnelle generelle serielle Ports und Quadratureingänge für Drehgeber zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== TI C5000 ===&lt;br /&gt;
&lt;br /&gt;
DSP für batteriebetriebene Anwendungen. Die gesamte Architektur wurde auf Stromverbrauch optimiert. Dazu werden spezielle Werkzeuge zur Verfügung gestellt, die zur Anwendung passende Optimierungslösungen generiert. [[TMS320VC5505 eZDSP USB Stick‎]] mit IDE als preisgünstiges Entwicklungssystem ( &amp;lt; 50€)&lt;br /&gt;
&lt;br /&gt;
=== TI C6000 ===&lt;br /&gt;
&lt;br /&gt;
DSP-Familie vom Marktführer Texas Instruments, enthält sowohl Fest- als auch Gleitkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
=== TI DM6400 (DaVinci) ===&lt;br /&gt;
&lt;br /&gt;
DSP für Videoanwendungen. Einige Derivate enthalten auch einen ARM9 als Co-Prozessor. Diese Familie wird unter dem Namen [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=dsp&amp;amp;sectionId=2&amp;amp;tabId=1852&amp;amp;familyId=1300 DaVinci] vermarktet.&lt;br /&gt;
&lt;br /&gt;
=== TI OMAP ===&lt;br /&gt;
&lt;br /&gt;
Prozessor für mobile Geräte, enthält einen ARM-Kern und einen C6000-DSP. Ein interessantes und mit $149 sehr preisgünstiges Evalboard ist das [http://www.beagleboard.org Beagle Board]. Ein kostenloser Assembler für den DSP ist verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== SHARC/TigerSHARC ===&lt;br /&gt;
&lt;br /&gt;
32 Bit Gleitkomma-DSP von Analog Devices.&lt;br /&gt;
&lt;br /&gt;
=== Blackfin ===&lt;br /&gt;
&lt;br /&gt;
Der Blackfin ist ein 16/32 Bit Festkomma-DSP von Analog Devices. Im Gegensatz zu den 16-bittigen Vorgängern ADSP-21xx, die häufig als Co-Prozessoren zur Signalverarbeitung zusammen mit einem Mikrocontroller verwendet werden, geht der Blackfin schon weit in den Einsatzbereich eines Allround-Prozessors hinein. So gibt es z.&amp;amp;nbsp;B. einen Linux-Port für Blackfin, Eval-Boards mit Ethernet, CAN, USB und vielen MB SDRAM. Dank der verbesserten Stromsparfunktionen der BF52x-Reihe ist diese eher neue Architektur vermehrt in mobilen Geräten (Kameras, Mediaplayer, etc.) anzutreffen.&lt;br /&gt;
&lt;br /&gt;
Wichtig für die Entwicklung ist zu wissen:&lt;br /&gt;
&lt;br /&gt;
* Kein Fließkomma-Support in Hardware&lt;br /&gt;
* Keine MMU, keine Unterstützung für virtuelles Memory (kein Unix fork(), etc.)&lt;br /&gt;
&lt;br /&gt;
Unterstützte Entwicklungswerkzeuge:&lt;br /&gt;
&lt;br /&gt;
* Visual DSP++: Hauseigenes Entwicklungstool von Analog Devices, kommerziell&lt;br /&gt;
* GCC: Freie GNU-Umgebung mit Assembler, Compiler, Linker, Debugger&lt;br /&gt;
* Eclipse für uClinux-Entwicklung wie auch &#039;standalone&#039; ohne OS&lt;br /&gt;
&lt;br /&gt;
Aufgrund der ausgereiften GNU-Toolchain ist der Blackfin eine der kostengünstigsten Plattformen für die Entwicklung. Die Tools laufen sowohl unter Windows32 als auch Linux, bevorzugt wird jedoch Linux eingesetzt. Für die Kernel-Entwicklung ist Linux unabdingbar.&lt;br /&gt;
Dank offener JTAG-Spezifikation existieren einige Tools von Drittherstellern zum Hardware-Debugging (In Circuit Emulation) und zur Programmierung:&lt;br /&gt;
&lt;br /&gt;
* [http://www.section5.ch/icebear ICEbear] JTAG: schneller USB-&amp;gt;JTAG adapter&lt;br /&gt;
* [http://www.ronetix.at/ PEEDI] High end JTAG, Ethernet&lt;br /&gt;
* [http://www.bluetechnix.at/rainbow2006/site/blackfin_family/__dev_tools/__gnice_jtag/409/gnice_jtag.aspx gnICE von Bluetechnix]&lt;br /&gt;
* [http://www.analog.com/en/processors-dsp/blackfin/emulator-100/processors/product.html JTAG-Adapter von Analog Devices]&lt;br /&gt;
&lt;br /&gt;
Beide Tools arbeiten auch mit ARM-Prozessoren.&lt;br /&gt;
&lt;br /&gt;
Weitere Links:&lt;br /&gt;
&lt;br /&gt;
* [http://www.bluetechnix.com/rainbow2006/default.aspx Bluetechnix Core-Module]&lt;br /&gt;
* [http://www.analog.com/blackfin Herstellerwebsite]&lt;br /&gt;
* [http://blackfin.uclinux.org/ uClinux Port und GNU toolchain]&lt;br /&gt;
&lt;br /&gt;
=== dsPIC ===&lt;br /&gt;
&lt;br /&gt;
Der [[dsPIC]] ist ein kleiner 16 Bit-Mikrocontroller mit DSP-Funktionen. Mit dem klassischen 8Bit-PIC hat er außer dem Namen nichts gemeinsam.&lt;br /&gt;
&lt;br /&gt;
Er basiert auf der modernen RISC-Architektur des PIC24 und bietet zusätzlich 40Bit Register und spezielle Befehle für DSP-Anwendungen. Der derzeit schnellste dsPIC33E arbeitet mit bis zu 70MIPS. dsPIC33 gibt es sogar im DIL28-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
Ein kostenloser C-Compiler (C30) und eine DSP-Bibliothek wird von Microchip angeboten. Dabei handelt es sich um eine &amp;quot;Lite&amp;quot;-Version des kommerziellen C30, bei dem nur eine Optimierungsstufe freigeschaltet ist, aber ansonsten keine Einschränkungen (Codegröße o.ä.) bestehen.&lt;br /&gt;
&lt;br /&gt;
=== TriCore ===&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;TriCore&#039;&#039;&#039; von Infineon ist ein 32-Bit-Mikrocontroller mit DSP-Funktionen, mit derzeitigem Schwerpunkt im Bereich der High Performance Embedded Real-Time Systems für Industrie-  und Automobilanwendungen (Beispiele: Motorsteuerungen, Servomotoren, Solarinverter, Multi-Axis-Conrol) &lt;br /&gt;
&lt;br /&gt;
* [http://www.infineon.com/cgi-bin/ifx/portal/ep/channelView.do?channelId=-78991&amp;amp;channelPage=%2Fep%2Fchannel%2FleafNote.jsp&amp;amp;pageTypeId=17099  Übersicht über die &#039;&#039;&#039;TriCore&#039;&#039;&#039; Produktfamilie]&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen für Starterkits/Evalboards ===&lt;br /&gt;
&lt;br /&gt;
* http://www.spectrumdigital.com - große Auswahl an Starterkits mit TI-DSPs, ab $300&lt;br /&gt;
* http://www.bluetechnix.com - Blackfin-Module ab € 150&lt;br /&gt;
* http://www.zbrain.ch/ - Blackfin-Modul, Preis: ?&lt;br /&gt;
* http://www.danvillesignal.com/ - ADSP-218x-Boards ab $200, Sharc-Boards ab $400&lt;br /&gt;
* http://docs.blackfin.uclinux.org/doku.php?id=buy_stuff - Blackfin BF533 STAMP $170 (keine analogen Schnittstellen, aber über Pfostenstecker leicht zu erweitern)&lt;br /&gt;
* http://www.sundance.com - High-End-Module mit TI C6000&lt;br /&gt;
* http://www.spectrumsignal.com/ - TMS320 und SHARC&lt;br /&gt;
* http://www.pentek.com/dspcentral/ - TMS430 und PowerPC&lt;br /&gt;
* http://www.bittware.com/ - SHARC und TigerSHARC&lt;br /&gt;
* http://www.hunteng.co.uk/ - C6000&lt;br /&gt;
* http://www.kanecomputing.co.uk&lt;br /&gt;
* http://www.dsp-systeme.net - DSP-Module mit DSP von TI und ADI&lt;br /&gt;
* http://search.digikey.com/scripts/DkSearch/dksus.dll?lang=de&amp;amp;site=DE&amp;amp;WT.z_homepage_link=hp_go_button&amp;amp;KeyWords=TMDX5505EZDSP&amp;amp;x=22&amp;amp;y=22  eZDSP  USB Stick , &amp;lt;50€&lt;br /&gt;
* http://www.dsp-weuffen.de  - TI C6727 Board und vielen Beispielen&lt;br /&gt;
* http://www.ehitex.de/artikel.php?xPD=131_132&amp;amp;kat_name= - Infineon TriCore Starter Kits&lt;br /&gt;
&lt;br /&gt;
== Weitere Infos==&lt;br /&gt;
&lt;br /&gt;
===Literatur ===&lt;br /&gt;
* Oppenheim, Schaefer: &amp;quot;Discrete Time Signal Processing&amp;quot;, ISBN 0131988425&lt;br /&gt;
* Proakis: &amp;quot;Digital Signal Processing&amp;quot;, ISBN 0131873741&lt;br /&gt;
* Lyons: &amp;quot;Understanding Digital Signal Processing&amp;quot;, ISBN 0131089897&lt;br /&gt;
* Smith: &amp;quot;The Scientist and Engineer&#039;s Guide to Digital Signal Processing&amp;quot;, ISBN  075067444X (unter http://dspguide.com/ als PDF verfügbar)&lt;br /&gt;
* Sanjit K. Mitra: &amp;quot;Handbook for Digital Signal Processing&amp;quot; (1993,1312 Seiten), ISBN 0471619957&lt;br /&gt;
&lt;br /&gt;
=== Foren ===&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-10-1.html DSP-Forum auf mikrocontroller.net (deutsch)]&lt;br /&gt;
* [http://groups.google.de/group/comp.dsp Newsgroup comp.dsp (Englisch)]&lt;br /&gt;
* [http://www.dsprelated.com/groups.php Discussion Groups (Englisch)]&lt;br /&gt;
&lt;br /&gt;
=== Webseiten ===&lt;br /&gt;
* http://www.dspguru.com/ - FAQs, Infos, Beispielcode, ...&lt;br /&gt;
* http://docs.google.com/View?docid=dg2hppb_4gtgk89 - evtl. interessant als Rohmaterial für diesen Artikel&lt;br /&gt;
* http://www.dsprelated.com - Blogs, Jobs, Comp.DSP, ...&lt;br /&gt;
* http://www.unidsp56.de/ Eine Entwicklungsplattform für den Amateur&lt;br /&gt;
* http://de.wikipedia.org/wiki/Datei:Aircraft-recognition-and-tracking-by-dsp-based-signal-processing.jpg&lt;br /&gt;
&lt;br /&gt;
=== Artikel aus der Kategorie DSP ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ncl style=compact maxdepth=2 headings=bullet headstart=2&lt;br /&gt;
      showcats=1 showarts=1&amp;gt;DSP&amp;lt;/ncl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=66870</id>
		<title>Digitale Signalverarbeitung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=66870"/>
		<updated>2012-06-14T21:21:30Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Anwendungsgebiete ==&lt;br /&gt;
&lt;br /&gt;
* Modulation/Demodulation zur Datenübertragung (z.&amp;amp;nbsp;B. Telefonmodem, DSL, GSM) - &amp;quot;Software Defined Radio&amp;quot; (SDR)&lt;br /&gt;
* Multimediacodierung (MP3, DivX, JPEG)&lt;br /&gt;
* Bildverarbeitung (Bildverbesserung)&lt;br /&gt;
* Mustererkennung, Objekterkennung&lt;br /&gt;
* Echo- und Störgeräuschunterdrückung bei Telefonen, Sprechgarnituren (Headsets) und Hörgeräten&lt;br /&gt;
&lt;br /&gt;
== Verfahren ==&lt;br /&gt;
&lt;br /&gt;
=== FIR- und IIR-Filter ===&lt;br /&gt;
&lt;br /&gt;
Die häufigste Aufgabe in der DSV ist das Filtern, das heißt, bestimmte Frequenzanteile zu unterdrücken, zu verstärken oder in der Phase zu verschieben. Man kann grundsätzlich zwischen zwei Filterarten unterscheiden:&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;FIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;F&#039;&#039;&#039;inite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) wird jeder Ausgangswert aus der Summe unterschiedlich gewichteter Eingangswerte zusammengesetzt, die dazu in Schieberegistern vorgehalten werden. Dabei bezeichnet man die maximale Anzahl an Werten, die bei der Berechnung berücksichtigt werden, als &#039;&#039;&#039;Ordnung&#039;&#039;&#039; oder auch Filtertiefe. Je höher die Ordnungszahl, desto besser nähern sich die die Eigenschaften des realen Filters bez. ripple, Steilheit und z.B. Dämpfung an das theoretische Ideal an, desto höher ist aber auch der Rechenaufwand.&lt;br /&gt;
&lt;br /&gt;
Werden bei FIR-Filtern nur zurückliegende Werte verwendet, so handelt es sich um ein &amp;quot;look back&amp;quot; - Filter. Dieses ist typisch für real time Anwendungen. Werden auch Werte verwendet, die nach dem eigentlichen Bezugzeitpunkt liegen, spricht man von einem look ahead-Filter. Dieses kann naturgemäß nicht in Echtzeit angewendet werden, bzw die Ausgabezeitpunkte müssen um mindestens die halbe Filtertiefe verzögert werden.&lt;br /&gt;
&lt;br /&gt;
==== Merkmale von FIR-Filtern ====&lt;br /&gt;
* immer stabil&lt;br /&gt;
* linearer Phasengang -&amp;gt; keine Phasenverzerrungen&lt;br /&gt;
* Ordnungen oft im zwei- bis dreistelligen Bereich&lt;br /&gt;
* problemlos realisierbar!&lt;br /&gt;
&lt;br /&gt;
==== Beispiel ====&lt;br /&gt;
Seien D(0), D(1) ... D(t) die eingehenden Daten, so wäre Y(t) = 1/k * (D(t) + D(t-1) + D(t-2) + ... + (t-k)) ein einfaches FIR-Filter der Ordnung &amp;quot;k&amp;quot;, das als gleitender Mittelwert bezeichnet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu FIR-Filtern werden bei &#039;&#039;&#039;IIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;I&#039;&#039;&#039;nfinite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) auch frühere &#039;&#039;&#039;Ausgangs&#039;&#039;&#039;werte in die Berechnung des aktuellen Ausgangswertes mit einbezogen. Wie man sich leicht vorstellen kann, kann dadurch die Antwort auf einen Eingangsimpuls theoretisch unendlich lang werden, da jeder Ausgangswert auf den Eingang rückgekoppelt wird.&lt;br /&gt;
&lt;br /&gt;
====Merkmale von IIR-Filtern====&lt;br /&gt;
* durch Rundungsfehler kann das [[Filter]] instabil werden -&amp;gt; &amp;quot;Aufschaukeln&amp;quot; durch Rückkopplung -&amp;gt; schwierigere Realisierung&lt;br /&gt;
* kein linearer Phasengang -&amp;gt; verschiedene Frequenzanteile werden durch den Filter unterschiedlich lange verzögert -&amp;gt; &amp;quot;Verzerrung&amp;quot;&lt;br /&gt;
* einziger Vorteil gegenüber FIR: Um einen gewünschten Frequenzgang zu erzielen, ist eine sehr viel niedrigere Ordnung ausreichend -&amp;gt; weniger Rechenaufwand&lt;br /&gt;
* Ordnung üblicherweise &amp;lt; 10&lt;br /&gt;
&lt;br /&gt;
==== Beispiel====&lt;br /&gt;
Seien D(0), D(1) ... D(t) wieder die eingehenden Daten, wie oben, und Y(t-1) der um einen Berechungsschritt zeitlich verzögerte Wert des Filterwertes Y(t), dann wäre Y(t) = Y(t-1) * (1-k)  +  D(t) * k ein IIR-Filter erster Ordnung, wobei 1/k die Dämpfung und damit die Grenzfrequenz des Filters bestimmt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Viele nützliche Informationen zur Realisierung gibt es im [http://www.dspguru.com/info/faqs/ FIR- und IIR-FAQ auf dspguru.com] (der dort erwähnte Sourcecode FirAlgs.c kann [[Media:FirAlgs.c|hier]] direkt heruntergeladen werden).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Berechnungssoftware&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.filter-solutions.com/digital.html Beschreibung der Digitalfiltertypen], [http://www.nuhertz.com/download.html hier kostenlose Testversion Filter Free]&lt;br /&gt;
&lt;br /&gt;
=== DFT und FFT ===&lt;br /&gt;
&lt;br /&gt;
Die FFT (Fast Fourier Transform) ist ein schneller Algorithmus zur Berechnung der DFT (Discrete Fourier Transform). Damit bezeichnet man die Transformation eines Zeitsignals (= eine Abfolge von Samples) in den Frequenzbereich (= Frequenzbestandteile des Signals). Die Transformation kann auch ohne Verlust umgekehrt durchgeführt werden, also vom Frequenz- in den Zeitbereich (Inverse Discrete Fourier Transform, IDFT). Eine DFT wird praktisch immer mit dem FFT-Algorithmus realisiert, weshalb die Bezeichnungen FFT/DFT oft gleichwertig verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die offensichtlichste Anwendung der FFT ist die Darstellung des Frequenzspektrums eines Signals. Aber das ist nur ein kleiner Teil der Anwendungsmöglichkeiten. Viele Verarbeitungen lassen sich im Frequenzbereich einfacher durchführen als im Zeitbereich, z.&amp;amp;nbsp;B. Korrelationen oder sehr lange FIR-Filter. Das zu verarbeitende Signal wird dazu in den Frequenzbereich transformiert, dort manipuliert, und wieder in den Zeitbereich zurücktransformiert. Das klingt vielleicht umständlich, kann aber in der Praxis sehr viel schneller sein als eine Realisierung im Zeitbereich.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/25095 Diskussion: FFT auf dem AVR]&lt;br /&gt;
* [http://sourceforge.net/projects/kissfft/ Kiss FFT] - einfache FFT-Bibliothek, in C, Floating- und Fixed Point, BSD-Lizenz, geeignet für Mikrocontroller&lt;br /&gt;
* [http://www.fftw.org/ FFTW] - &#039;&#039;&#039;die&#039;&#039;&#039; Floating Point FFT-Bibliothek für PCs, GPL-Lizenz&lt;br /&gt;
*[http://www.sprut.de/electronic/pic/16bit/dsp/fft/fft.htm FFT - verständlich auch für Nichtakademiker (Deutsch)]&lt;br /&gt;
* [http://www.science.smith.edu/departments/Physics/fstaff/gfelder/ffteasy/ ffteasy - Einfache Routinen zur FFT]&lt;br /&gt;
&lt;br /&gt;
==== Goertzel-Algorithmus ====&lt;br /&gt;
&lt;br /&gt;
Liegt das Interesse bei der Berechnung einer DFT / FFT nur bei wenigen bestimmten Frequenz-Linien, so gibt es eine weniger rechenaufwendige Alternative mit diesem Algorithmus. Die Grenze, ab der Goertzel-Algo nicht mehr effektiv genug ist, liegt grob bei etwa 15% der Spektralfrequenzen.&lt;br /&gt;
&lt;br /&gt;
Das typische Anwendungsgebiet sind DTMF-Dekoder in Software.&lt;br /&gt;
Hierfür sind sogar die üblichen 8-bit-AVR-Controller ausreichend schnell.&lt;br /&gt;
&lt;br /&gt;
=== Signalerzeugung ===&lt;br /&gt;
&lt;br /&gt;
Für die Korrelation von Eingangssignalen mit zuvor ausgesendeten oder bekannten Signalformen zwecks Mustererkennung müssen oftmals eigenen Signale generiert werden.&lt;br /&gt;
&lt;br /&gt;
Rechteck-, Sägezahn- und Dreieckssignale lassen sich mit einfachen Zählern realisieren. &lt;br /&gt;
&lt;br /&gt;
Möchte man Sinus- oder beliebige andere Signalformen erzeugen, bietet es sich an, vorausberechnete Funktionswerte im Speicher abzulegen und der Reihe nach auszugeben. Eine variable Frequenzeinstellung kann man durch die Methode der Direkten Digitalen Synthese (&#039;&#039;&#039;DDS&#039;&#039;&#039;) realisieren.&lt;br /&gt;
&lt;br /&gt;
* [[Digitaler Funktionsgenerator]] - ausführliche Erklärung des Verfahrens im PDF, Beispielcode für AVR&lt;br /&gt;
* http://www.myplace.nu/avr/minidds/ - noch ein AVR-Projekt&lt;br /&gt;
* http://www.hit.bme.hu/~papay/sci/DDS/start.htm - noch eine Erklärung&lt;br /&gt;
&lt;br /&gt;
Eine weitere Methode zur Realisierung von (mehr oder weniger beliebigen) Funktionen ist die &#039;&#039;&#039;Polynomapproximation&#039;&#039;&#039;. Dabei nähert man die zu erzeugende Funktion durch ein Polynom an und verwendet das Horner-Schema, um die einzelnen Funktionswerte zu berechnen. Für ein Polynom der Ordnung N benötigt man damit pro Wert N+1 Multiplikationen (N ist üblicherweise &amp;lt;= 10).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Zur Entwicklung von Signalverarbeitungsverfahren gibt es eine ganze Reihe von Programmen. Neben kleinen Werkzeugen für den Filterentwurf und spezialisierten Bibliotheken zum Einbinden in eigene Programme existieren mehrere Mathematikprogramme, mit denen sich Signale verarbeiten und darstellen lassen. Die drei wichtigsten sind Matlab, Octave und Scilab.&lt;br /&gt;
&lt;br /&gt;
=== MATLAB ===&lt;br /&gt;
&lt;br /&gt;
MATLAB ist das Standardprogramm für numerische Mathematik. In der digitalen Signalverarbeitung wird es häufig verwendet, um einen Algorithmus vor der Umsetzung in C-Code oder auf einen DSP zu entwickeln und zu testen. Zum schon recht hohen Preis der Grundsoftware muss man noch einige hundert Euro für diverse Toolboxes einplanen (Signal Processing, Filter Design, Image Processing). Die [http://www.mikrocontroller.net/link/isbn/0979223903 Studentenversion] kostet ca. 80 Euro (die Signal Processing Toolbox und ein paar andere sind bereits enthalten).&lt;br /&gt;
&lt;br /&gt;
MATLAB ist für Windows, Linux, Mac OS X, Solaris und HP-UX erhältlich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://users.ece.gatech.edu/%7Ebonnie/book/TUTORIAL/tutorial.html - Englischsprachiges MATLAB-Tutorial&lt;br /&gt;
* http://www.mathworks.com/access/helpdesk/help/techdoc/matlab.shtml - MATLAB-Referenz&lt;br /&gt;
* http://www.eng.auburn.edu/~sjreeves/Classes/DSP/DSP.html - MATLAB for DSP (allgemeine Tipps und Hinweise)&lt;br /&gt;
&lt;br /&gt;
=== Octave ===&lt;br /&gt;
&lt;br /&gt;
Das Open-Source-Programm Octave zeichnet sich durch einen hohen Grad an Matlab-Kompatibilität aus; das geht so weit, dass man problemlos die Matlab-Online-Hilfe und Matlab-Einführungen zum Lernen verwenden kann. Im Zusatzpaket Octave-Forge sind auch viele Funktionen der Matlab-Toolboxes enthalten (z.&amp;amp;nbsp;B. Filterdesign, Signalverarbeitung). Octave ist ein reines Kommandozeilenprogramm, so dass man auf alle Annehmlichkeiten der Matlab-GUI verzichten muss. Zum Plotten wird gnuplot verwendet.&lt;br /&gt;
&lt;br /&gt;
Octave lässt sich auf praktisch jedem Unix-System kompilieren. Für Windows gibt es ein fertig kompiliertes Paket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://octave.sourceforge.net/ - Übersicht über alle Funktionen von Octave/Octave-Forge&lt;br /&gt;
&lt;br /&gt;
=== Scilab / Scicos ===&lt;br /&gt;
&lt;br /&gt;
Auch das Open-Source-Programmpaket Scilab / Scicos, ähnlich leistungsfähig wie Matlab und seine Zusatzmodule, ist kostenlos und im Quelltext erhältlich. Während die Grundsyntax (Kontrollstrukturen, Ausdrücke) weitgehend Matlab-kompatibel ist, gibt es bei den Funktionen z.T. deutliche Abweichungen. Dafür bietet Scilab / Scicos verglichen mit Octave umfangreichere Möglichkeiten zur grafischen Darstellung, die über das 2D- und 3D-Plotten von Funktionen weit hinausgehen, z.&amp;amp;nbsp;B. lassen sich Linien, Kreise usw. zeichnen.&lt;br /&gt;
&lt;br /&gt;
Scilab / Scicos läuft unter Windows, Linux/Unix und Mac OS X. Für die wichtigsten Linux-Distributionen sind fertige, komplette Binärpakete (RPM, ...) zur einfachen Installation frei verfügbar. Für Windows gibt es ebenfalls ein einfach zu installierendes Komplettpaket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scilab.org/ Scilab Homepage (Universelles Wissenschaftlich-Technisches Mathematik-Paket)]&lt;br /&gt;
* [http://www.scicos.org/ Scicos Homepage (Modellations- und Simulations-Paket für Scilab, ist im Scilab-Download enthalten)]&lt;br /&gt;
* [http://www-rocq.inria.fr/scicos/scicosmodnum.html ModNum Digital communication toolbox zu Scicos]&lt;br /&gt;
* [http://www.scilab.org/publications/index_publications.php?page=freebooks Übersicht zur Literatur: Webtexte, Bücher und Zeitschriftenartikel]&lt;br /&gt;
&#039;&#039;&#039;Bücher&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scicos.org/book.html Modeling and Simulation in Scilab/Scicos, (für Version 3.0, aktuell ist Version 4.1.2)]&lt;br /&gt;
&#039;&#039;&#039;Tutorials&#039;&#039;&#039;:&lt;br /&gt;
* [http://wiki.scilab.org/Tutorials?action=AttachFile&amp;amp;do=get&amp;amp;target=signal.pdf Signal Processing with Scilab (1998)], [http://wuarchive.wustl.edu/pub/aminet/misc/math/scilab-doc.lha Beispielfiles dazu lha-gepackt (1996)] [http://aminet.net/package/misc/math/scilab-doc oder hier], [http://viewvc.scilab.org/bin/cgi/viewvc.cgi/trunk/scilab_doc/signal/Nfigs_source/ hier auch einzeln erhältlich]&lt;br /&gt;
* [http://www.scilab.org/publications/delicado/scilab.pdf DSP-Tutorial in spanisch, teilweise aus dem englischen Tutorial entnommen]&lt;br /&gt;
* [http://www.neurotraces.com/scilab/scilab2/index.html Treatment of neurophysiological signals using Scilab, HTML-Texte mit Kapiteln zu Filtern, FFT usw.]&lt;br /&gt;
* [http://www.scilab.org/publications/TELECOM/ComNumSc.zip Digital-Kommunikation - französisches Tutorial, gezipptes Postscript]&lt;br /&gt;
* [http://www.mate.tue.nl/mate/pdfs/6827.pdf Beispielprojekt mit Vergleich SciCos und SciLab]&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ein DSP (&#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ignal &#039;&#039;&#039;P&#039;&#039;&#039;rocessor) ist eine spezielle CPU mit einem auf die Verarbeitung von Signalen optimierten Kern und Befehlssatz. Unterschieden wird hauptsächlich zwischen Gleitkomma- und Festkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
Charakteristisches Merkmal vieler DSPs ist eine VLIW-Architektur (&#039;&#039;&#039;V&#039;&#039;&#039;ery &#039;&#039;&#039;L&#039;&#039;&#039;ong &#039;&#039;&#039;I&#039;&#039;&#039;nstruction &#039;&#039;&#039;W&#039;&#039;&#039;ord). Dabei werden Anweisungen für mehrere parallele Ausführungseinheiten (Multiplizierer/Addierer/Akkumulatoren) und mehrere Lade-/Speicherbefehle in einem einzigen, langen Befehlswort kodiert, und in einem Takt ausgeführt. Dazu kommen häufig mehrere gleichzeitig adressierbare Speicherbänke, Unterstützung für Ringpuffer, Schleifen ohne Sprung-Overhead, Bit-Reverse-Adressierung (wichtig für FFT) und Arithmetik mit Sättigungs- statt Überlaufverhalten (wichtig für die Realisierung von IIR-Filtern).&lt;br /&gt;
&lt;br /&gt;
Seit ein paar Jahren beginnen die Grenzen zwischen Mikrocontrollern und DSPs etwas zu verschwimmen. Viele Mikrocontroller werden mit zusätzlichen DSP-Funktionen ausgestattet ([[PICCOLO]], [[dsPIC]], [[ARM]]), während DSPs zunehmend in Richtung der Aufgabenbereiche eines Mikrocontrollers oder Allround-Prozessors vordringen und immer öfter um Unterstützung für Betriebssysteme (MMU) oder I/O-Funktionen wie Ethernet oder USB erweitert werden ([[Blackfin]]).&lt;br /&gt;
&lt;br /&gt;
Eine noch größere DSP-Rechenleistung kann mit programmierbaren Logikbausteinen (&#039;&#039;&#039;[[FPGA]]&#039;&#039;&#039;s) erzielt werden, da die Anzahl gleichzeitig ausführbarer Rechenoperationen nur durch die Größe des FPGAs begrenzt wird. Nachteilig sind die gegenüber DSPs um ein vielfaches höheren Kosten, höherer Stromverbrauch und höherer Entwicklungsaufwand, weshalb FPGAs für Signalverarbeitung nur in sehr speziellen Anwendungen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aktuelle &#039;&#039;&#039;PC-Prozessoren&#039;&#039;&#039; sind sehr gut für Gleitkomma-Signalverarbeitung geeignet. Wenn keine besonderen Anforderungen an Echtzeitfähigkeit, Strom- oder Platzbedarf gestellt werden, hat ein normaler PC mit Abstand das beste Preis/Leistungsverhältnis. Der erste Schritt bei einem DSP-Projekt sollte somit eine Implementierung auf dem PC sein. Es macht wenig Sinn, ein Eval-Board für einen Signalprozessor zu kaufen und einfach loszulegen.&lt;br /&gt;
&lt;br /&gt;
=== Fest- oder Gleitkomma? ===&lt;br /&gt;
&lt;br /&gt;
Signalverarbeitung auf einem Gleitkomma- (Floating-Point-) Rechner ist grundsätzlich einfacher als auf einem Festkomma- (Fixed-Point-) Rechner. Da die Ungenauigkeiten bei der Rechnung mit Floating-Point-Zahlen in vielen Fällen vernachlässigbar sind, kann man einen Algorithmus i.d.R. 1:1 in Programmcode umsetzen. Hat man nur Festkomma-Rechenoperationen zur Verfügung wird es etwas ungemütlich. Man muss sich Gedanken um die Skalierung der Daten, die Reihenfolge von Rechenoperationen, Überläufe, Rundungsrauschen usw. machen. Da Gleitkomma-DSPs allerdings teurer sind und mehr Strom verbrauchen, werden für Massenprodukte fast ausschließlich Festkomma-DSPs bzw. ASICs mit Festkomma-Rechenwerken verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TI C2000 ===&lt;br /&gt;
&lt;br /&gt;
Eine komplette 32-bit DSC Controller Familie vom low-cost ([http://www.ti.com/corp/docs/landing/f280xx-piccolo/index.htm PICCOLO]) bis high-end Controller mit FPU ([http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=mcu&amp;amp;sectionId=95&amp;amp;tabId=2108&amp;amp;familyId=1414&amp;amp;paramCriteria=no TMS320F28335]).&lt;br /&gt;
Die Peripherie umfasst Mehrkanal A/D Wandler mit 12-bit Aufloesung und bis zu 4 Megasamples Abtastrate. Die PWMs haben einen hochauflösenden Modus, der bis zu 150ps auflösen kann. Als Interface stehen CAN, I2C, schnelle generelle serielle Ports und Quadratureingänge für Drehgeber zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== TI C5000 ===&lt;br /&gt;
&lt;br /&gt;
DSP für Batterieapplikationen. Die gesamte Architektur wurde auf Stromverbrauch optimiert. Dazu werden spezielle Tools zur Verfügung gestellt, die zur Anwendung passende Optimierungslösungen generiert. [[TMS320VC5505 eZDSP USB Stick‎]] mit IDE als preisgünstiges Entwicklungssystem ( &amp;lt; 50€)&lt;br /&gt;
&lt;br /&gt;
=== TI C6000 ===&lt;br /&gt;
&lt;br /&gt;
DSP-Familie vom Marktführer Texas Instruments, enthält sowohl Fest- als auch Gleitkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
=== TI DM6400 (DaVinci) ===&lt;br /&gt;
&lt;br /&gt;
DSP für Videoanwendungen. Einige Derivate enthalten auch einen ARM9 als Co-Prozessor. Diese Familie wird unter dem Namen [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=dsp&amp;amp;sectionId=2&amp;amp;tabId=1852&amp;amp;familyId=1300 DaVinci] vermarktet.&lt;br /&gt;
&lt;br /&gt;
=== TI OMAP ===&lt;br /&gt;
&lt;br /&gt;
Prozessor für mobile Geräte, enthält einen ARM-Kern und einen C6000-DSP. Ein interessantes und mit $149 sehr preisgünstiges Evalboard ist das [http://www.beagleboard.org Beagle Board]. Ein kostenloser Assembler für den DSP ist verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== SHARC/TigerSHARC ===&lt;br /&gt;
&lt;br /&gt;
32 Bit Gleitkomma-DSP von Analog Devices.&lt;br /&gt;
&lt;br /&gt;
=== Blackfin ===&lt;br /&gt;
&lt;br /&gt;
Der Blackfin ist ein 16/32 Bit Festkomma-DSP von Analog Devices. Im Gegensatz zu den 16-bittigen Vorgängern ADSP-21xx, die häufig als Co-Prozessoren zur Signalverarbeitung zusammen mit einem Mikrocontroller verwendet werden, geht der Blackfin schon weit in den Einsatzbereich eines Allround-Prozessors hinein. So gibt es z.&amp;amp;nbsp;B. einen Linux-Port für Blackfin, Eval-Boards mit Ethernet, CAN, USB und vielen MB SDRAM. Dank der verbesserten Stromsparfunktionen der BF52x-Reihe ist diese eher neue Architektur vermehrt in mobilen Geräten (Kameras, Mediaplayer, etc.) anzutreffen.&lt;br /&gt;
&lt;br /&gt;
Wichtig für die Entwicklung ist zu wissen:&lt;br /&gt;
&lt;br /&gt;
* Kein Fließkomma-Support in Hardware&lt;br /&gt;
* Keine MMU, keine Unterstützung für virtuelles Memory (kein Unix fork(), etc.)&lt;br /&gt;
&lt;br /&gt;
Unterstützte Entwicklungswerkzeuge:&lt;br /&gt;
&lt;br /&gt;
* Visual DSP++: Hauseigenes Entwicklungstool von Analog Devices, kommerziell&lt;br /&gt;
* GCC: Freie GNU-Umgebung mit Assembler, Compiler, Linker, Debugger&lt;br /&gt;
* Eclipse für uClinux-Entwicklung wie auch &#039;standalone&#039; ohne OS&lt;br /&gt;
&lt;br /&gt;
Aufgrund der ausgereiften GNU-Toolchain ist der Blackfin eine der kostengünstigsten Plattformen für die Entwicklung. Die Tools laufen sowohl unter Windows32 als auch Linux, bevorzugt wird jedoch Linux eingesetzt. Für die Kernel-Entwicklung ist Linux unabdingbar.&lt;br /&gt;
Dank offener JTAG-Spezifikation existieren einige Tools von Drittherstellern zum Hardware-Debugging (In Circuit Emulation) und zur Programmierung:&lt;br /&gt;
&lt;br /&gt;
* [http://www.section5.ch/icebear ICEbear] JTAG: schneller USB-&amp;gt;JTAG adapter&lt;br /&gt;
* [http://www.ronetix.at/ PEEDI] High end JTAG, Ethernet&lt;br /&gt;
* [http://www.bluetechnix.at/rainbow2006/site/blackfin_family/__dev_tools/__gnice_jtag/409/gnice_jtag.aspx gnICE von Bluetechnix]&lt;br /&gt;
* [http://www.analog.com/en/processors-dsp/blackfin/emulator-100/processors/product.html JTAG-Adapter von Analog Devices]&lt;br /&gt;
&lt;br /&gt;
Beide Tools arbeiten auch mit ARM-Prozessoren.&lt;br /&gt;
&lt;br /&gt;
Weitere Links:&lt;br /&gt;
&lt;br /&gt;
* [http://www.bluetechnix.com/rainbow2006/default.aspx Bluetechnix Core-Module]&lt;br /&gt;
* [http://www.analog.com/blackfin Herstellerwebsite]&lt;br /&gt;
* [http://blackfin.uclinux.org/ uClinux Port und GNU toolchain]&lt;br /&gt;
&lt;br /&gt;
=== dsPIC ===&lt;br /&gt;
&lt;br /&gt;
Der [[dsPIC]] ist ein kleiner 16 Bit-Mikrocontroller mit DSP-Funktionen. Mit dem klassischen 8Bit-PIC hat er außer dem Namen nichts gemeinsam.&lt;br /&gt;
&lt;br /&gt;
Er basiert auf der modernen RISC-Architektur des PIC24 und bietet zusätzlich 40Bit Register und spezielle Befehle für DSP-Anwendungen. Der derzeit schnellste dsPIC33E arbeitet mit bis zu 70MIPS. dsPIC33 gibt es sogar im DIL28-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
Ein kostenloser C-Compiler (C30) und eine DSP-Bibliothek wird von Microchip angeboten. Dabei handelt es sich um eine &amp;quot;Lite&amp;quot;-Version des kommerziellen C30, bei dem nur eine Optimierungsstufe freigeschaltet ist, aber ansonsten keine Einschränkungen (Codegröße o.ä.) bestehen.&lt;br /&gt;
&lt;br /&gt;
=== TriCore ===&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;TriCore&#039;&#039;&#039; von Infineon ist ein 32-Bit-Mikrocontroller mit DSP-Funktionen, mit derzeitigem Schwerpunkt im Bereich der High Performance Embedded Real-Time Systems für Industrie-  und Automobilanwendungen (Beispiele: Motorsteuerungen, Servomotoren, Solarinverter, Multi-Axis-Conrol) &lt;br /&gt;
&lt;br /&gt;
* [http://www.infineon.com/cgi-bin/ifx/portal/ep/channelView.do?channelId=-78991&amp;amp;channelPage=%2Fep%2Fchannel%2FleafNote.jsp&amp;amp;pageTypeId=17099  Übersicht über die &#039;&#039;&#039;TriCore&#039;&#039;&#039; Produktfamilie]&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen für Starterkits/Evalboards ===&lt;br /&gt;
&lt;br /&gt;
* http://www.spectrumdigital.com - große Auswahl an Starterkits mit TI-DSPs, ab $300&lt;br /&gt;
* http://www.bluetechnix.com - Blackfin-Module ab € 150&lt;br /&gt;
* http://www.zbrain.ch/ - Blackfin-Modul, Preis: ?&lt;br /&gt;
* http://www.danvillesignal.com/ - ADSP-218x-Boards ab $200, Sharc-Boards ab $400&lt;br /&gt;
* http://docs.blackfin.uclinux.org/doku.php?id=buy_stuff - Blackfin BF533 STAMP $170 (keine analogen Schnittstellen, aber über Pfostenstecker leicht zu erweitern)&lt;br /&gt;
* http://www.sundance.com - High-End-Module mit TI C6000&lt;br /&gt;
* http://www.spectrumsignal.com/ - TMS320 und SHARC&lt;br /&gt;
* http://www.pentek.com/dspcentral/ - TMS430 und PowerPC&lt;br /&gt;
* http://www.bittware.com/ - SHARC und TigerSHARC&lt;br /&gt;
* http://www.hunteng.co.uk/ - C6000&lt;br /&gt;
* http://www.kanecomputing.co.uk&lt;br /&gt;
* http://www.dsp-systeme.net - DSP-Module mit DSP von TI und ADI&lt;br /&gt;
* http://search.digikey.com/scripts/DkSearch/dksus.dll?lang=de&amp;amp;site=DE&amp;amp;WT.z_homepage_link=hp_go_button&amp;amp;KeyWords=TMDX5505EZDSP&amp;amp;x=22&amp;amp;y=22  eZDSP  USB Stick , &amp;lt;50€&lt;br /&gt;
* http://www.dsp-weuffen.de  - TI C6727 Board und vielen Beispielen&lt;br /&gt;
* http://www.ehitex.de/artikel.php?xPD=131_132&amp;amp;kat_name= - Infineon TriCore Starter Kits&lt;br /&gt;
&lt;br /&gt;
== Weitere Infos==&lt;br /&gt;
&lt;br /&gt;
===Literatur ===&lt;br /&gt;
* Oppenheim, Schaefer: &amp;quot;Discrete Time Signal Processing&amp;quot;, ISBN 0131988425&lt;br /&gt;
* Proakis: &amp;quot;Digital Signal Processing&amp;quot;, ISBN 0131873741&lt;br /&gt;
* Lyons: &amp;quot;Understanding Digital Signal Processing&amp;quot;, ISBN 0131089897&lt;br /&gt;
* Smith: &amp;quot;The Scientist and Engineer&#039;s Guide to Digital Signal Processing&amp;quot;, ISBN  075067444X (unter http://dspguide.com/ als PDF verfügbar)&lt;br /&gt;
* Sanjit K. Mitra: &amp;quot;Handbook for Digital Signal Processing&amp;quot; (1993,1312 Seiten), ISBN 0471619957&lt;br /&gt;
&lt;br /&gt;
=== Foren ===&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-10-1.html DSP-Forum auf mikrocontroller.net (deutsch)]&lt;br /&gt;
* [http://groups.google.de/group/comp.dsp Newsgroup comp.dsp (Englisch)]&lt;br /&gt;
* [http://www.dsprelated.com/groups.php Discussion Groups (Englisch)]&lt;br /&gt;
&lt;br /&gt;
=== Webseiten ===&lt;br /&gt;
* http://www.dspguru.com/ - FAQs, Infos, Beispielcode, ...&lt;br /&gt;
* http://docs.google.com/View?docid=dg2hppb_4gtgk89 - evtl. interessant als Rohmaterial für diesen Artikel&lt;br /&gt;
* http://www.dsprelated.com - Blogs, Jobs, Comp.DSP, ...&lt;br /&gt;
* http://www.unidsp56.de/ Eine Entwicklungsplattform für den Amateur&lt;br /&gt;
* http://de.wikipedia.org/wiki/Datei:Aircraft-recognition-and-tracking-by-dsp-based-signal-processing.jpg&lt;br /&gt;
&lt;br /&gt;
=== Artikel aus der Kategorie DSP ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ncl style=compact maxdepth=2 headings=bullet headstart=2&lt;br /&gt;
      showcats=1 showarts=1&amp;gt;DSP&amp;lt;/ncl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=66869</id>
		<title>Digitale Signalverarbeitung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=66869"/>
		<updated>2012-06-14T21:19:09Z</updated>

		<summary type="html">&lt;p&gt;84.163.162.33: /* Signalerzeugung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Anwendungsgebiete ==&lt;br /&gt;
&lt;br /&gt;
* Modulation/Demodulation zur Datenübertragung (z.&amp;amp;nbsp;B. Telefonmodem, DSL, GSM) - &amp;quot;Software Defined Radio&amp;quot; (SDR)&lt;br /&gt;
* Multimediacodierung (MP3, DivX, JPEG)&lt;br /&gt;
* Bildverarbeitung (Bildverbesserung)&lt;br /&gt;
* Mustererkennung, Objekterkennung&lt;br /&gt;
* Echo- und Störgeräuschunterdrückung bei Telefonen, Sprechgarnituren (Headsets) und Hörgeräten&lt;br /&gt;
&lt;br /&gt;
== Verfahren ==&lt;br /&gt;
&lt;br /&gt;
=== FIR- und IIR-Filter ===&lt;br /&gt;
&lt;br /&gt;
Die häufigste Aufgabe in der DSV ist das Filtern, das heißt, bestimmte Frequenzanteile zu unterdrücken, zu verstärken oder in der Phase zu verschieben. Man kann grundsätzlich zwischen zwei Filterarten unterscheiden:&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;FIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;F&#039;&#039;&#039;inite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) wird jeder Ausgangswert aus der Summe unterschiedlich gewichteter Eingangswerte zusammengesetzt, die dazu in Schieberegistern vorgehalten werden. Dabei bezeichnet man die maximale Anzahl an Werten, die bei der Berechnung berücksichtigt werden, als &#039;&#039;&#039;Ordnung&#039;&#039;&#039; oder auch Filtertiefe. Je höher die Ordnungszahl, desto besser nähern sich die die Eigenschaften des realen Filters bez. ripple, Steilheit und z.B. Dämpfung an das theoretische Ideal an, desto höher ist aber auch der Rechenaufwand.&lt;br /&gt;
&lt;br /&gt;
Werden bei FIR-Filtern nur zurückliegende Werte verwendet, so handelt es sich um ein &amp;quot;look back&amp;quot; - Filter. Dieses ist typisch für real time Anwendungen. Werden auch Werte verwendet, die nach dem eigentlichen Bezugzeitpunkt liegen, spricht man von einem look ahead-Filter. Dieses kann naturgemäß nicht in Echtzeit angewendet werden, bzw die Ausgabezeitpunkte müssen um mindestens die halbe Filtertiefe verzögert werden.&lt;br /&gt;
&lt;br /&gt;
==== Merkmale von FIR-Filtern ====&lt;br /&gt;
* immer stabil&lt;br /&gt;
* linearer Phasengang -&amp;gt; keine Phasenverzerrungen&lt;br /&gt;
* Ordnungen oft im zwei- bis dreistelligen Bereich&lt;br /&gt;
* problemlos realisierbar!&lt;br /&gt;
&lt;br /&gt;
==== Beispiel ====&lt;br /&gt;
Seien D(0), D(1) ... D(t) die eingehenden Daten, so wäre Y(t) = 1/k * (D(t) + D(t-1) + D(t-2) + ... + (t-k)) ein einfaches FIR-Filter der Ordnung &amp;quot;k&amp;quot;, das als gleitender Mittelwert bezeichnet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu FIR-Filtern werden bei &#039;&#039;&#039;IIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;I&#039;&#039;&#039;nfinite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) auch frühere &#039;&#039;&#039;Ausgangs&#039;&#039;&#039;werte in die Berechnung des aktuellen Ausgangswertes mit einbezogen. Wie man sich leicht vorstellen kann, kann dadurch die Antwort auf einen Eingangsimpuls theoretisch unendlich lang werden, da jeder Ausgangswert auf den Eingang rückgekoppelt wird.&lt;br /&gt;
&lt;br /&gt;
====Merkmale von IIR-Filtern====&lt;br /&gt;
* durch Rundungsfehler kann das [[Filter]] instabil werden -&amp;gt; &amp;quot;Aufschaukeln&amp;quot; durch Rückkopplung -&amp;gt; schwierigere Realisierung&lt;br /&gt;
* kein linearer Phasengang -&amp;gt; verschiedene Frequenzanteile werden durch den Filter unterschiedlich lange verzögert -&amp;gt; &amp;quot;Verzerrung&amp;quot;&lt;br /&gt;
* einziger Vorteil gegenüber FIR: Um einen gewünschten Frequenzgang zu erzielen, ist eine sehr viel niedrigere Ordnung ausreichend -&amp;gt; weniger Rechenaufwand&lt;br /&gt;
* Ordnung üblicherweise &amp;lt; 10&lt;br /&gt;
&lt;br /&gt;
==== Beispiel====&lt;br /&gt;
Seien D(0), D(1) ... D(t) wieder die eingehenden Daten, wie oben, und Y(t-1) der um einen Berechungsschritt zeitlich verzögerte Wert des Filterwertes Y(t), dann wäre Y(t) = Y(t-1) * (1-k)  +  D(t) * k ein IIR-Filter erster Ordnung, wobei 1/k die Dämpfung und damit die Grenzfrequenz des Filters bestimmt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Viele nützliche Informationen zur Realisierung gibt es im [http://www.dspguru.com/info/faqs/ FIR- und IIR-FAQ auf dspguru.com] (der dort erwähnte Sourcecode FirAlgs.c kann [[Media:FirAlgs.c|hier]] direkt heruntergeladen werden).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Berechnungssoftware&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.filter-solutions.com/digital.html Beschreibung der Digitalfiltertypen], [http://www.nuhertz.com/download.html hier kostenlose Testversion Filter Free]&lt;br /&gt;
&lt;br /&gt;
=== DFT und FFT ===&lt;br /&gt;
&lt;br /&gt;
Die FFT (Fast Fourier Transform) ist ein schneller Algorithmus zur Berechnung der DFT (Discrete Fourier Transform). Damit bezeichnet man die Transformation eines Zeitsignals (= eine Abfolge von Samples) in den Frequenzbereich (= Frequenzbestandteile des Signals). Die Transformation kann auch ohne Verlust umgekehrt durchgeführt werden, also vom Frequenz- in den Zeitbereich (Inverse Discrete Fourier Transform, IDFT). Eine DFT wird praktisch immer mit dem FFT-Algorithmus realisiert, weshalb die Bezeichnungen FFT/DFT oft gleichwertig verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die offensichtlichste Anwendung der FFT ist die Darstellung des Frequenzspektrums eines Signals. Aber das ist nur ein kleiner Teil der Anwendungsmöglichkeiten. Viele Verarbeitungen lassen sich im Frequenzbereich einfacher durchführen als im Zeitbereich, z.&amp;amp;nbsp;B. Korrelationen oder sehr lange FIR-Filter. Das zu verarbeitende Signal wird dazu in den Frequenzbereich transformiert, dort manipuliert, und wieder in den Zeitbereich zurücktransformiert. Das klingt vielleicht umständlich, kann aber in der Praxis sehr viel schneller sein als eine Realisierung im Zeitbereich.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/25095 Diskussion: FFT auf dem AVR]&lt;br /&gt;
* [http://sourceforge.net/projects/kissfft/ Kiss FFT] - einfache FFT-Bibliothek, in C, Floating- und Fixed Point, BSD-Lizenz, geeignet für Mikrocontroller&lt;br /&gt;
* [http://www.fftw.org/ FFTW] - &#039;&#039;&#039;die&#039;&#039;&#039; Floating Point FFT-Bibliothek für PCs, GPL-Lizenz&lt;br /&gt;
*[http://www.sprut.de/electronic/pic/16bit/dsp/fft/fft.htm FFT - verständlich auch für Nichtakademiker (Deutsch)]&lt;br /&gt;
* [http://www.science.smith.edu/departments/Physics/fstaff/gfelder/ffteasy/ ffteasy - Einfache Routinen zur FFT]&lt;br /&gt;
&lt;br /&gt;
==== Goertzel-Algorithmus ====&lt;br /&gt;
&lt;br /&gt;
Liegt das Interesse bei der Berechnung einer DFT / FFT nur bei wenigen bestimmten Frequenz-Linien, so gibt es eine weniger rechenaufwendige Alternative mit diesem Algorithmus. Die Grenze, ab der Goertzel-Algo nicht mehr effektiv genug ist, liegt grob bei etwa 15% der Spektralfrequenzen.&lt;br /&gt;
&lt;br /&gt;
Das typische Anwendungsgebiet sind DTMF-Dekoder in Software.&lt;br /&gt;
Hierfür sind sogar die üblichen 8-bit-AVR-Controller ausreichend schnell.&lt;br /&gt;
&lt;br /&gt;
=== Signalerzeugung ===&lt;br /&gt;
&lt;br /&gt;
Für die Korrelation von Eingangssignalen mit zuvor ausgesendeten oder bekannten Signalformen zwecks Mustererkennung müssen oftmals eigenen Signale generiert werden.&lt;br /&gt;
&lt;br /&gt;
Rechteck-, Sägezahn- und Dreieckssignale lassen sich mit einfachen Zählern realisieren. &lt;br /&gt;
&lt;br /&gt;
Möchte man Sinus- oder beliebige andere Signalformen erzeugen, bietet es sich an, vorausberechnete Funktionswerte im Speicher abzulegen und der Reihe nach auszugeben. Eine variable Frequenzeinstellung kann man durch die Methode der Direkten Digitalen Synthese (&#039;&#039;&#039;DDS&#039;&#039;&#039;) realisieren.&lt;br /&gt;
&lt;br /&gt;
* [[Digitaler Funktionsgenerator]] - ausführliche Erklärung des Verfahrens im PDF, Beispielcode für AVR&lt;br /&gt;
* http://www.myplace.nu/avr/minidds/ - noch ein AVR-Projekt&lt;br /&gt;
* http://www.hit.bme.hu/~papay/sci/DDS/start.htm - noch eine Erklärung&lt;br /&gt;
&lt;br /&gt;
Eine weitere Methode zur Realisierung von (mehr oder weniger beliebigen) Funktionen ist die &#039;&#039;&#039;Polynomapproximation&#039;&#039;&#039;. Dabei nähert man die zu erzeugende Funktion durch ein Polynom an und verwendet das Horner-Schema, um die einzelnen Funktionswerte zu berechnen. Für ein Polynom der Ordnung N benötigt man damit pro Wert N+1 Multiplikationen (N ist üblicherweise &amp;lt;= 10).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Zur Entwicklung von Signalverarbeitungsverfahren gibt es eine ganze Reihe von Programmen. Neben kleinen Tools für Filterdesign und spezialisierten Bibliotheken zum Einbinden in eigene Programme gibt es mehrere Mathematikprogramme, mit denen sich Signale verarbeiten und darstellen lassen. Die drei wichtigsten sind Matlab, Octave und Scilab.&lt;br /&gt;
&lt;br /&gt;
=== MATLAB ===&lt;br /&gt;
&lt;br /&gt;
MATLAB ist das Standardprogramm für numerische Mathematik. In der digitalen Signalverarbeitung wird es häufig verwendet, um einen Algorithmus vor der Umsetzung in C-Code oder auf einen DSP zu entwickeln und zu testen. Zum schon recht hohen Preis der Grundsoftware muss man noch einige hundert Euro für diverse Toolboxes einplanen (Signal Processing, Filter Design, Image Processing). Die [http://www.mikrocontroller.net/link/isbn/0979223903 Studentenversion] kostet ca. 80 Euro (die Signal Processing Toolbox und ein paar andere sind bereits enthalten).&lt;br /&gt;
&lt;br /&gt;
MATLAB ist für Windows, Linux, Mac OS X, Solaris und HP-UX erhältlich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://users.ece.gatech.edu/%7Ebonnie/book/TUTORIAL/tutorial.html - Englischsprachiges MATLAB-Tutorial&lt;br /&gt;
* http://www.mathworks.com/access/helpdesk/help/techdoc/matlab.shtml - MATLAB-Referenz&lt;br /&gt;
* http://www.eng.auburn.edu/~sjreeves/Classes/DSP/DSP.html - MATLAB for DSP (allgemeine Tipps und Hinweise)&lt;br /&gt;
&lt;br /&gt;
=== Octave ===&lt;br /&gt;
&lt;br /&gt;
Das Open-Source-Programm Octave zeichnet sich durch einen hohen Grad an Matlab-Kompatibilität aus; das geht so weit, dass man problemlos die Matlab-Online-Hilfe und Matlab-Einführungen zum Lernen verwenden kann. In dem Zusatzpaket Octave-Forge sind auch viele Funktionen der Matlab-Toolboxes enthalten (z.&amp;amp;nbsp;B. Filterdesign, Signalverarbeitung). Octave ist ein reines Kommandozeilenprogramm, so dass man auf alle Annehmlichkeiten des Matlab-GUI verzichten muss. Zum Plotten wird gnuplot verwendet.&lt;br /&gt;
&lt;br /&gt;
Octave lässt sich auf praktisch jedem Unix kompilieren. Für Windows gibt es ein fertig kompiliertes Paket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://octave.sourceforge.net/ - Übersicht über alle Funktionen von Octave/Octave-Forge&lt;br /&gt;
&lt;br /&gt;
=== Scilab / Scicos ===&lt;br /&gt;
&lt;br /&gt;
Auch das Open-Source-Programmpaket Scilab / Scicos, ähnlich leistungsfähig wie Matlab und seine Zusatzmodule, ist kostenlos und im Quelltext erhältlich. Während die Grundsyntax (Kontrollstrukturen, Ausdrücke) weitgehend Matlab-kompatibel ist, gibt es bei den Funktionen z.T. deutliche Abweichungen. Dafür bietet Scilab / Scicos verglichen mit Octave umfangreichere Möglichkeiten zur grafischen Darstellung, die über das 2D- und 3D-Plotten von Funktionen weit hinausgehen, z.&amp;amp;nbsp;B. lassen sich Linien, Kreise usw. zeichnen.&lt;br /&gt;
&lt;br /&gt;
Scilab / Scicos läuft unter Windows, Linux/Unix und Mac OS X. Für die wichtigsten Linux-Distributionen sind fertige, komplette Binärpakete (RPM, ...) zur einfachen Installation frei verfügbar. Für Windows gibt es ebenfalls ein einfach zu installierendes Komplettpaket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scilab.org/ Scilab Homepage (Universelles Wissenschaftlich-Technisches Mathematik-Paket)]&lt;br /&gt;
* [http://www.scicos.org/ Scicos Homepage (Modellations- und Simulations-Paket für Scilab, ist im Scilab-Download enthalten)]&lt;br /&gt;
* [http://www-rocq.inria.fr/scicos/scicosmodnum.html ModNum Digital communication toolbox zu Scicos]&lt;br /&gt;
* [http://www.scilab.org/publications/index_publications.php?page=freebooks Übersicht zur Literatur: Webtexte, Bücher und Zeitschriftenartikel]&lt;br /&gt;
&#039;&#039;&#039;Bücher&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scicos.org/book.html Modeling and Simulation in Scilab/Scicos, (für Version 3.0, aktuell ist Version 4.1.2)]&lt;br /&gt;
&#039;&#039;&#039;Tutorials&#039;&#039;&#039;:&lt;br /&gt;
* [http://wiki.scilab.org/Tutorials?action=AttachFile&amp;amp;do=get&amp;amp;target=signal.pdf Signal Processing with Scilab (1998)], [http://wuarchive.wustl.edu/pub/aminet/misc/math/scilab-doc.lha Beispielfiles dazu lha-gepackt (1996)] [http://aminet.net/package/misc/math/scilab-doc oder hier], [http://viewvc.scilab.org/bin/cgi/viewvc.cgi/trunk/scilab_doc/signal/Nfigs_source/ hier auch einzeln erhältlich]&lt;br /&gt;
* [http://www.scilab.org/publications/delicado/scilab.pdf DSP-Tutorial in spanisch, teilweise aus dem englischen Tutorial entnommen]&lt;br /&gt;
* [http://www.neurotraces.com/scilab/scilab2/index.html Treatment of neurophysiological signals using Scilab, HTML-Texte mit Kapiteln zu Filtern, FFT usw.]&lt;br /&gt;
* [http://www.scilab.org/publications/TELECOM/ComNumSc.zip Digital-Kommunikation - französisches Tutorial, gezipptes Postscript]&lt;br /&gt;
* [http://www.mate.tue.nl/mate/pdfs/6827.pdf Beispielprojekt mit Vergleich SciCos und SciLab]&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ein DSP (&#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ignal &#039;&#039;&#039;P&#039;&#039;&#039;rocessor) ist eine spezielle CPU mit einem auf die Verarbeitung von Signalen optimierten Kern und Befehlssatz. Unterschieden wird hauptsächlich zwischen Gleitkomma- und Festkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
Charakteristisches Merkmal vieler DSPs ist eine VLIW-Architektur (&#039;&#039;&#039;V&#039;&#039;&#039;ery &#039;&#039;&#039;L&#039;&#039;&#039;ong &#039;&#039;&#039;I&#039;&#039;&#039;nstruction &#039;&#039;&#039;W&#039;&#039;&#039;ord). Dabei werden Anweisungen für mehrere parallele Ausführungseinheiten (Multiplizierer/Addierer/Akkumulatoren) und mehrere Lade-/Speicherbefehle in einem einzigen, langen Befehlswort kodiert, und in einem Takt ausgeführt. Dazu kommen häufig mehrere gleichzeitig adressierbare Speicherbänke, Unterstützung für Ringpuffer, Schleifen ohne Sprung-Overhead, Bit-Reverse-Adressierung (wichtig für FFT) und Arithmetik mit Sättigungs- statt Überlaufverhalten (wichtig für die Realisierung von IIR-Filtern).&lt;br /&gt;
&lt;br /&gt;
Seit ein paar Jahren beginnen die Grenzen zwischen Mikrocontrollern und DSPs etwas zu verschwimmen. Viele Mikrocontroller werden mit zusätzlichen DSP-Funktionen ausgestattet ([[PICCOLO]], [[dsPIC]], [[ARM]]), während DSPs zunehmend in Richtung der Aufgabenbereiche eines Mikrocontrollers oder Allround-Prozessors vordringen und immer öfter um Unterstützung für Betriebssysteme (MMU) oder I/O-Funktionen wie Ethernet oder USB erweitert werden ([[Blackfin]]).&lt;br /&gt;
&lt;br /&gt;
Eine noch größere DSP-Rechenleistung kann mit programmierbaren Logikbausteinen (&#039;&#039;&#039;[[FPGA]]&#039;&#039;&#039;s) erzielt werden, da die Anzahl gleichzeitig ausführbarer Rechenoperationen nur durch die Größe des FPGAs begrenzt wird. Nachteilig sind die gegenüber DSPs um ein vielfaches höheren Kosten, höherer Stromverbrauch und höherer Entwicklungsaufwand, weshalb FPGAs für Signalverarbeitung nur in sehr speziellen Anwendungen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aktuelle &#039;&#039;&#039;PC-Prozessoren&#039;&#039;&#039; sind sehr gut für Gleitkomma-Signalverarbeitung geeignet. Wenn keine besonderen Anforderungen an Echtzeitfähigkeit, Strom- oder Platzbedarf gestellt werden, hat ein normaler PC mit Abstand das beste Preis/Leistungsverhältnis. Der erste Schritt bei einem DSP-Projekt sollte somit eine Implementierung auf dem PC sein. Es macht wenig Sinn, ein Eval-Board für einen Signalprozessor zu kaufen und einfach loszulegen.&lt;br /&gt;
&lt;br /&gt;
=== Fest- oder Gleitkomma? ===&lt;br /&gt;
&lt;br /&gt;
Signalverarbeitung auf einem Gleitkomma- (Floating-Point-) Rechner ist grundsätzlich einfacher als auf einem Festkomma- (Fixed-Point-) Rechner. Da die Ungenauigkeiten bei der Rechnung mit Floating-Point-Zahlen in vielen Fällen vernachlässigbar sind, kann man einen Algorithmus i.d.R. 1:1 in Programmcode umsetzen. Hat man nur Festkomma-Rechenoperationen zur Verfügung wird es etwas ungemütlich. Man muss sich Gedanken um die Skalierung der Daten, die Reihenfolge von Rechenoperationen, Überläufe, Rundungsrauschen usw. machen. Da Gleitkomma-DSPs allerdings teurer sind und mehr Strom verbrauchen, werden für Massenprodukte fast ausschließlich Festkomma-DSPs bzw. ASICs mit Festkomma-Rechenwerken verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TI C2000 ===&lt;br /&gt;
&lt;br /&gt;
Eine komplette 32-bit DSC Controller Familie vom low-cost ([http://www.ti.com/corp/docs/landing/f280xx-piccolo/index.htm PICCOLO]) bis high-end Controller mit FPU ([http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=mcu&amp;amp;sectionId=95&amp;amp;tabId=2108&amp;amp;familyId=1414&amp;amp;paramCriteria=no TMS320F28335]).&lt;br /&gt;
Die Peripherie umfasst Mehrkanal A/D Wandler mit 12-bit Aufloesung und bis zu 4 Megasamples Abtastrate. Die PWMs haben einen hochauflösenden Modus, der bis zu 150ps auflösen kann. Als Interface stehen CAN, I2C, schnelle generelle serielle Ports und Quadratureingänge für Drehgeber zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== TI C5000 ===&lt;br /&gt;
&lt;br /&gt;
DSP für Batterieapplikationen. Die gesamte Architektur wurde auf Stromverbrauch optimiert. Dazu werden spezielle Tools zur Verfügung gestellt, die zur Anwendung passende Optimierungslösungen generiert. [[TMS320VC5505 eZDSP USB Stick‎]] mit IDE als preisgünstiges Entwicklungssystem ( &amp;lt; 50€)&lt;br /&gt;
&lt;br /&gt;
=== TI C6000 ===&lt;br /&gt;
&lt;br /&gt;
DSP-Familie vom Marktführer Texas Instruments, enthält sowohl Fest- als auch Gleitkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
=== TI DM6400 (DaVinci) ===&lt;br /&gt;
&lt;br /&gt;
DSP für Videoanwendungen. Einige Derivate enthalten auch einen ARM9 als Co-Prozessor. Diese Familie wird unter dem Namen [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=dsp&amp;amp;sectionId=2&amp;amp;tabId=1852&amp;amp;familyId=1300 DaVinci] vermarktet.&lt;br /&gt;
&lt;br /&gt;
=== TI OMAP ===&lt;br /&gt;
&lt;br /&gt;
Prozessor für mobile Geräte, enthält einen ARM-Kern und einen C6000-DSP. Ein interessantes und mit $149 sehr preisgünstiges Evalboard ist das [http://www.beagleboard.org Beagle Board]. Ein kostenloser Assembler für den DSP ist verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== SHARC/TigerSHARC ===&lt;br /&gt;
&lt;br /&gt;
32 Bit Gleitkomma-DSP von Analog Devices.&lt;br /&gt;
&lt;br /&gt;
=== Blackfin ===&lt;br /&gt;
&lt;br /&gt;
Der Blackfin ist ein 16/32 Bit Festkomma-DSP von Analog Devices. Im Gegensatz zu den 16-bittigen Vorgängern ADSP-21xx, die häufig als Co-Prozessoren zur Signalverarbeitung zusammen mit einem Mikrocontroller verwendet werden, geht der Blackfin schon weit in den Einsatzbereich eines Allround-Prozessors hinein. So gibt es z.&amp;amp;nbsp;B. einen Linux-Port für Blackfin, Eval-Boards mit Ethernet, CAN, USB und vielen MB SDRAM. Dank der verbesserten Stromsparfunktionen der BF52x-Reihe ist diese eher neue Architektur vermehrt in mobilen Geräten (Kameras, Mediaplayer, etc.) anzutreffen.&lt;br /&gt;
&lt;br /&gt;
Wichtig für die Entwicklung ist zu wissen:&lt;br /&gt;
&lt;br /&gt;
* Kein Fließkomma-Support in Hardware&lt;br /&gt;
* Keine MMU, keine Unterstützung für virtuelles Memory (kein Unix fork(), etc.)&lt;br /&gt;
&lt;br /&gt;
Unterstützte Entwicklungswerkzeuge:&lt;br /&gt;
&lt;br /&gt;
* Visual DSP++: Hauseigenes Entwicklungstool von Analog Devices, kommerziell&lt;br /&gt;
* GCC: Freie GNU-Umgebung mit Assembler, Compiler, Linker, Debugger&lt;br /&gt;
* Eclipse für uClinux-Entwicklung wie auch &#039;standalone&#039; ohne OS&lt;br /&gt;
&lt;br /&gt;
Aufgrund der ausgereiften GNU-Toolchain ist der Blackfin eine der kostengünstigsten Plattformen für die Entwicklung. Die Tools laufen sowohl unter Windows32 als auch Linux, bevorzugt wird jedoch Linux eingesetzt. Für die Kernel-Entwicklung ist Linux unabdingbar.&lt;br /&gt;
Dank offener JTAG-Spezifikation existieren einige Tools von Drittherstellern zum Hardware-Debugging (In Circuit Emulation) und zur Programmierung:&lt;br /&gt;
&lt;br /&gt;
* [http://www.section5.ch/icebear ICEbear] JTAG: schneller USB-&amp;gt;JTAG adapter&lt;br /&gt;
* [http://www.ronetix.at/ PEEDI] High end JTAG, Ethernet&lt;br /&gt;
* [http://www.bluetechnix.at/rainbow2006/site/blackfin_family/__dev_tools/__gnice_jtag/409/gnice_jtag.aspx gnICE von Bluetechnix]&lt;br /&gt;
* [http://www.analog.com/en/processors-dsp/blackfin/emulator-100/processors/product.html JTAG-Adapter von Analog Devices]&lt;br /&gt;
&lt;br /&gt;
Beide Tools arbeiten auch mit ARM-Prozessoren.&lt;br /&gt;
&lt;br /&gt;
Weitere Links:&lt;br /&gt;
&lt;br /&gt;
* [http://www.bluetechnix.com/rainbow2006/default.aspx Bluetechnix Core-Module]&lt;br /&gt;
* [http://www.analog.com/blackfin Herstellerwebsite]&lt;br /&gt;
* [http://blackfin.uclinux.org/ uClinux Port und GNU toolchain]&lt;br /&gt;
&lt;br /&gt;
=== dsPIC ===&lt;br /&gt;
&lt;br /&gt;
Der [[dsPIC]] ist ein kleiner 16 Bit-Mikrocontroller mit DSP-Funktionen. Mit dem klassischen 8Bit-PIC hat er außer dem Namen nichts gemeinsam.&lt;br /&gt;
&lt;br /&gt;
Er basiert auf der modernen RISC-Architektur des PIC24 und bietet zusätzlich 40Bit Register und spezielle Befehle für DSP-Anwendungen. Der derzeit schnellste dsPIC33E arbeitet mit bis zu 70MIPS. dsPIC33 gibt es sogar im DIL28-Gehäuse. &lt;br /&gt;
&lt;br /&gt;
Ein kostenloser C-Compiler (C30) und eine DSP-Bibliothek wird von Microchip angeboten. Dabei handelt es sich um eine &amp;quot;Lite&amp;quot;-Version des kommerziellen C30, bei dem nur eine Optimierungsstufe freigeschaltet ist, aber ansonsten keine Einschränkungen (Codegröße o.ä.) bestehen.&lt;br /&gt;
&lt;br /&gt;
=== TriCore ===&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;TriCore&#039;&#039;&#039; von Infineon ist ein 32-Bit-Mikrocontroller mit DSP-Funktionen, mit derzeitigem Schwerpunkt im Bereich der High Performance Embedded Real-Time Systems für Industrie-  und Automobilanwendungen (Beispiele: Motorsteuerungen, Servomotoren, Solarinverter, Multi-Axis-Conrol) &lt;br /&gt;
&lt;br /&gt;
* [http://www.infineon.com/cgi-bin/ifx/portal/ep/channelView.do?channelId=-78991&amp;amp;channelPage=%2Fep%2Fchannel%2FleafNote.jsp&amp;amp;pageTypeId=17099  Übersicht über die &#039;&#039;&#039;TriCore&#039;&#039;&#039; Produktfamilie]&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen für Starterkits/Evalboards ===&lt;br /&gt;
&lt;br /&gt;
* http://www.spectrumdigital.com - große Auswahl an Starterkits mit TI-DSPs, ab $300&lt;br /&gt;
* http://www.bluetechnix.com - Blackfin-Module ab € 150&lt;br /&gt;
* http://www.zbrain.ch/ - Blackfin-Modul, Preis: ?&lt;br /&gt;
* http://www.danvillesignal.com/ - ADSP-218x-Boards ab $200, Sharc-Boards ab $400&lt;br /&gt;
* http://docs.blackfin.uclinux.org/doku.php?id=buy_stuff - Blackfin BF533 STAMP $170 (keine analogen Schnittstellen, aber über Pfostenstecker leicht zu erweitern)&lt;br /&gt;
* http://www.sundance.com - High-End-Module mit TI C6000&lt;br /&gt;
* http://www.spectrumsignal.com/ - TMS320 und SHARC&lt;br /&gt;
* http://www.pentek.com/dspcentral/ - TMS430 und PowerPC&lt;br /&gt;
* http://www.bittware.com/ - SHARC und TigerSHARC&lt;br /&gt;
* http://www.hunteng.co.uk/ - C6000&lt;br /&gt;
* http://www.kanecomputing.co.uk&lt;br /&gt;
* http://www.dsp-systeme.net - DSP-Module mit DSP von TI und ADI&lt;br /&gt;
* http://search.digikey.com/scripts/DkSearch/dksus.dll?lang=de&amp;amp;site=DE&amp;amp;WT.z_homepage_link=hp_go_button&amp;amp;KeyWords=TMDX5505EZDSP&amp;amp;x=22&amp;amp;y=22  eZDSP  USB Stick , &amp;lt;50€&lt;br /&gt;
* http://www.dsp-weuffen.de  - TI C6727 Board und vielen Beispielen&lt;br /&gt;
* http://www.ehitex.de/artikel.php?xPD=131_132&amp;amp;kat_name= - Infineon TriCore Starter Kits&lt;br /&gt;
&lt;br /&gt;
== Weitere Infos==&lt;br /&gt;
&lt;br /&gt;
===Literatur ===&lt;br /&gt;
* Oppenheim, Schaefer: &amp;quot;Discrete Time Signal Processing&amp;quot;, ISBN 0131988425&lt;br /&gt;
* Proakis: &amp;quot;Digital Signal Processing&amp;quot;, ISBN 0131873741&lt;br /&gt;
* Lyons: &amp;quot;Understanding Digital Signal Processing&amp;quot;, ISBN 0131089897&lt;br /&gt;
* Smith: &amp;quot;The Scientist and Engineer&#039;s Guide to Digital Signal Processing&amp;quot;, ISBN  075067444X (unter http://dspguide.com/ als PDF verfügbar)&lt;br /&gt;
* Sanjit K. Mitra: &amp;quot;Handbook for Digital Signal Processing&amp;quot; (1993,1312 Seiten), ISBN 0471619957&lt;br /&gt;
&lt;br /&gt;
=== Foren ===&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-10-1.html DSP-Forum auf mikrocontroller.net (deutsch)]&lt;br /&gt;
* [http://groups.google.de/group/comp.dsp Newsgroup comp.dsp (Englisch)]&lt;br /&gt;
* [http://www.dsprelated.com/groups.php Discussion Groups (Englisch)]&lt;br /&gt;
&lt;br /&gt;
=== Webseiten ===&lt;br /&gt;
* http://www.dspguru.com/ - FAQs, Infos, Beispielcode, ...&lt;br /&gt;
* http://docs.google.com/View?docid=dg2hppb_4gtgk89 - evtl. interessant als Rohmaterial für diesen Artikel&lt;br /&gt;
* http://www.dsprelated.com - Blogs, Jobs, Comp.DSP, ...&lt;br /&gt;
* http://www.unidsp56.de/ Eine Entwicklungsplattform für den Amateur&lt;br /&gt;
* http://de.wikipedia.org/wiki/Datei:Aircraft-recognition-and-tracking-by-dsp-based-signal-processing.jpg&lt;br /&gt;
&lt;br /&gt;
=== Artikel aus der Kategorie DSP ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ncl style=compact maxdepth=2 headings=bullet headstart=2&lt;br /&gt;
      showcats=1 showarts=1&amp;gt;DSP&amp;lt;/ncl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DSP]]&lt;/div&gt;</summary>
		<author><name>84.163.162.33</name></author>
	</entry>
</feed>