Gecko3 - CCC Event Weblog
Gecko3 - CCC Event Weblog
Gecko3 - CCC Event Weblog
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Gecko3</strong><br />
New generation of the Microlab HW/SW<br />
co-design Platform<br />
Students: Matthias Zurbrügg, Christoph Zimmermann<br />
Professor: Dr. Marcel Jacomet<br />
8th May 2007
Abstract<br />
The goal of this diploma thesis was to develop the required software for the <strong>Gecko3</strong> Board.<br />
The Gecko is a development system based on an FPGA for system-on-chip, VLSI designs<br />
and educational purpose. The Gecko2 was developed in 2001. Meanwhile the requirements<br />
have risen and new ideas indicate that it is time for a new generation. The new generation<br />
includes a wider concept then the old one. It is now a multi-module system with great flexibility,<br />
containing a new FPGA board, the <strong>Gecko3</strong>, and a fast ARM based processor board<br />
called Colibri. This concept fulfills the requirements for a scalable system from a simple<br />
educational system, in combination with a robotic module the so called eBot, to high speed<br />
systems for image-processing, telecommunication and signal-processing applications.<br />
The actually planed features for the <strong>Gecko3</strong> board include:<br />
• FPGA with 1.5 Mio. gates<br />
• USB 2.0 interface<br />
• Enough RAM and Flash to support Linux<br />
• Ethernet interface<br />
• Small, as size range of a credit card<br />
• Compatible with IP-Cores included in the Xilinx EDK and from Opencores.org<br />
Our work was divided into different parts of software development. One part was the<br />
Microcontroller software for the Cypress EZ-USB FX2 chip is implemented in C to communicate<br />
with the FPGA at high datarates, to configure the FPGA direct from the host PC or<br />
from the on board serial flash memory and to store FPGA configurations and firmware. We<br />
also designed hardware cores in VHDL to test the communication with the FPGA and show<br />
how the handshaking between the EZ-USB FX2 and the FPGA works. Another part was the<br />
development of the host PC software to access all functions of the Gecko Board. The goal<br />
was to write a multiplattform software which runs on Windows and Linux and enables a fast<br />
and intuitive way for users to use the Gecko Board and implement their specific application<br />
software.<br />
The <strong>Gecko3</strong> project is not finished yet, but our diploma thesis is an other big step for its<br />
realisation.<br />
Project Report<br />
i
Inhaltsverzeichnis<br />
Abbildungsverzeichnis<br />
Tabellenverzeichnis<br />
v<br />
vii<br />
1. Überblick 1<br />
1.1. Ziele der Gecko Plattform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />
1.2. Der Vorgänger: Gecko2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />
1.3. Die neue Generation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />
1.4. Funktionsumfang des <strong>Gecko3</strong> Boards . . . . . . . . . . . . . . . . . . . . . . . 3<br />
2. Definition der Diplomarbeit und Projekt Organisation 5<br />
3. Entwicklungsumgebung 6<br />
3.1. Entwicklungshardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />
3.2. Entwicklungssoftware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />
3.3. Inbetriebnahme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />
4. Kommunikation zwischen EZ-USB und FPGA 10<br />
4.1. Handshake-Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
5. VHDL 13<br />
5.1. Kommunikations Loopback . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
5.1.1. Zweck und Anforderungen . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
5.1.2. Realisierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
5.1.3. Testbench und Simulationsergebnis . . . . . . . . . . . . . . . . . . . . 14<br />
6. Firmware 17<br />
6.1. Programmstruktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />
6.2. USB organisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />
6.3. Grundstruktur der Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />
6.4. FPGA Konfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />
6.5. Stand-alone Betrieb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />
6.5.1. EEPROM beschreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />
6.5.2. EEPROM auslesen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />
6.6. FPGA Autokonfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />
6.6.1. SPI Flash beschreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />
6.6.2. SPI Flash auslesen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28<br />
6.6.3. FPGA Bootload . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28<br />
6.7. Kommunikation zwischen Host und FPGA . . . . . . . . . . . . . . . . . . . . 29<br />
6.7.1. Read Waveform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30<br />
ii<br />
Matthias Zurbrügg, Christoph Zimmermann
Inhaltsverzeichnis<br />
6.7.2. Write Waveform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />
6.7.3. Datenrate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34<br />
6.8. Vendor Requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />
7. Hostsoftware 37<br />
7.1. Planung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />
7.2. Realisierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />
7.3. Gecko Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />
7.4. Gecko Administrator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41<br />
7.5. Beispielprogramm: Simplecom . . . . . . . . . . . . . . . . . . . . . . . . . . . 42<br />
8. Ausblick 43<br />
8.1. Weiteres Vorgehen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />
8.1.1. Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />
8.1.2. Hostsoftware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />
8.1.3. FPGA Cores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />
8.1.4. <strong>Gecko3</strong> Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44<br />
9. Schlusskapitel 45<br />
A. Projekt- und Zeitplanung 47<br />
B. Definition der Verbindung des Spartan3 Boards mit dem EZ-USB FX2<br />
Board 51<br />
C. Hex to Bix 53<br />
D. GPIF Designer 55<br />
E. Quellcode 57<br />
E.1. Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58<br />
E.1.1. Cypress Firmware Framwork . . . . . . . . . . . . . . . . . . . . . . . 58<br />
E.1.2. Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63<br />
E.1.3. FPGA Konfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72<br />
E.1.4. EEPROM schreiben und lesen . . . . . . . . . . . . . . . . . . . . . . 74<br />
E.1.5. SPI Flash schreiben und lesen . . . . . . . . . . . . . . . . . . . . . . . 77<br />
E.1.6. SPI Flash Ansteuerung . . . . . . . . . . . . . . . . . . . . . . . . . . 81<br />
E.1.7. SPI Kommunikation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83<br />
E.1.8. Kommunikation zwischen Host und FPGA . . . . . . . . . . . . . . . 85<br />
E.1.9. GPIF Waveform Source Code . . . . . . . . . . . . . . . . . . . . . . . 87<br />
E.1.10. Headers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92<br />
E.2. Loopback Core . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95<br />
E.2.1. Top . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95<br />
E.2.2. Datenpfad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97<br />
E.2.3. Statemachine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99<br />
E.3. Hostsoftware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103<br />
E.3.1. Klasse QGecko . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103<br />
E.3.2. Gecko Administrator . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109<br />
Project Report<br />
iii
Inhaltsverzeichnis<br />
E.3.3. Simplecom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117<br />
F. Schemas 122<br />
F.1. Gecko 3, Stand 9. Dezember 2006 . . . . . . . . . . . . . . . . . . . . . . . . . 122<br />
F.2. Flashboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141<br />
G. Grössenplanung der <strong>Gecko3</strong> Leiterplatte 142<br />
Literaturverzeichnis 143<br />
iv<br />
Matthias Zurbrügg, Christoph Zimmermann
Abbildungsverzeichnis<br />
1.1. Aufbau des geplanten eBots (Vollausbau) . . . . . . . . . . . . . . . . . . . . 2<br />
1.2. Blockdiagramm des <strong>Gecko3</strong> Moduls . . . . . . . . . . . . . . . . . . . . . . . . 3<br />
3.1. Abdeckung unserer Entwicklungshardware im Vergleich zum <strong>Gecko3</strong> . . . . . 7<br />
3.2. Xilinx Spartan 3 Starter Kit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />
3.3. Cypress EZ-USB FX2LP Development Kit . . . . . . . . . . . . . . . . . . . . 8<br />
4.1. Handshake Blockdiagramm . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
4.2. Flussdiagramm vom EZ-USB Richtung FPGA . . . . . . . . . . . . . . . . . . 11<br />
4.3. Flussdiagramm vom FPGA Richtung EZ-USB . . . . . . . . . . . . . . . . . . 11<br />
5.1. Schema der höchsten Ebene des Loopback Cores . . . . . . . . . . . . . . . . 14<br />
5.2. Statemachine des Loopback Cores . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
5.3. Signalverlauf der Simulation des Loopback Cores . . . . . . . . . . . . . . . . 15<br />
6.1. Organisation der Endpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />
6.2. Grundstruktur der Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />
6.3. FPGA Konfiguration über Host . . . . . . . . . . . . . . . . . . . . . . . . . . 22<br />
6.4. EEPROM beschreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />
6.5. EEPROM auslesen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />
6.6. SPI Flash beschreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />
6.7. SPI Flash auslesen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28<br />
6.8. GPIF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29<br />
6.9. GPIF Read Funktion der Firmware . . . . . . . . . . . . . . . . . . . . . . . . 30<br />
6.10. Read Waveform (FPGA to GPIF) . . . . . . . . . . . . . . . . . . . . . . . . 31<br />
6.11. Write Waveform (GPIF to FPGA) . . . . . . . . . . . . . . . . . . . . . . . . 32<br />
6.12. GPIF Write Funktion der Firmware . . . . . . . . . . . . . . . . . . . . . . . 33<br />
6.13. Downstream von 512 Byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34<br />
6.14. Upstream von 512 Byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />
7.1. GUI zur FPGA Konfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . 41<br />
7.2. GUI zum Download der Konfigurationsdatei . . . . . . . . . . . . . . . . . . . 41<br />
7.3. GUI zum Aktualisieren der Firmware . . . . . . . . . . . . . . . . . . . . . . . 41<br />
7.4. Informationsseite des Gecko Administrators . . . . . . . . . . . . . . . . . . . 41<br />
A.1. Abhänigkeiten der Projektziele . . . . . . . . . . . . . . . . . . . . . . . . . . 48<br />
A.2. Soll Zeitplan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49<br />
A.3. Ist Zeitplan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50<br />
C.1. Starten einer zusätzlichen Software nach der Kompilation . . . . . . . . . . . 53<br />
Project Report<br />
v
ABBILDUNGSVERZEICHNIS<br />
D.1. Block Diagram Register im GPIF Designer . . . . . . . . . . . . . . . . . . . 55<br />
D.2. Waveform der Übertragungsart zuweisen . . . . . . . . . . . . . . . . . . . . . 56<br />
F.1. Blockdiagramm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123<br />
F.2. FPGA Blockdiagramm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124<br />
F.3. Erster Teil des FPGAs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125<br />
F.4. Zweiter Teil des FPGAs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126<br />
F.5. FPGA Konfiguration und Spannungsversorgung . . . . . . . . . . . . . . . . . 127<br />
F.6. DDR SDRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128<br />
F.7. paralleles NOR Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129<br />
F.8. USB 2.0 und FPGA Boot System . . . . . . . . . . . . . . . . . . . . . . . . . 130<br />
F.9. I 2 C Bus mit EEPROM und I/O Baustein . . . . . . . . . . . . . . . . . . . . 131<br />
F.10.Ethernet PHY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132<br />
F.11.SPI Flash, Speicher für FPGA Konfigurationen . . . . . . . . . . . . . . . . . 133<br />
F.12.Schalter, Taster und LEDs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134<br />
F.13.Erweiterungsbus, 1. Teil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135<br />
F.14.Erweiterungsbus, 2. Teil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136<br />
F.15.Spannungsversorgung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137<br />
F.16.JTAG Anschluss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138<br />
F.17.Ethernet Anschluss Print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139<br />
F.18.RS232 Anschluss Print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140<br />
F.19.Adapterprint Intel NOR Flash . . . . . . . . . . . . . . . . . . . . . . . . . . 141<br />
G.1. Zeichnung des <strong>Gecko3</strong> Board im Masssstab 1:1 . . . . . . . . . . . . . . . . . 142<br />
vi<br />
Matthias Zurbrügg, Christoph Zimmermann
Tabellenverzeichnis<br />
B.1. Definition der Verbindung zwischen dem Spartan 3 Starter Kit und dem EZ-<br />
USB FX2LP Development Kit . . . . . . . . . . . . . . . . . . . . . . . . . . 52<br />
Project Report<br />
vii
1. Überblick<br />
Dieses Kapitel dient dazu, dem Leser einen Überblick über das ganze Projekt und der Vorgeschichte<br />
zu geben.<br />
1.1. Ziele der Gecko Plattform<br />
Wie der Titel dieser Arbeit andeutet, handelt es sich bei diesem Projekt nicht um eine Neuentwicklung,<br />
sondern um die konsequente Weiterführung des bestehenden Gecko Konzepts.<br />
Dieses Konzept beinhaltet eine universell einsetzbare Hardware Plattform, hauptsächlich bestehend<br />
aus einem FPGA, die es ermöglicht in kurzer Zeit Projekte aus dem Gebiet VLSI<br />
oder SoC (System on Chip) zu realisieren und zu testen. Sie dient auch als Übungsplattform<br />
in den Fächern Digitaltechnik und VLSI Design, die es den Studenten erlaubt die Theorie<br />
praktisch zu vertiefen. Zu diesem Zweck existiert auch ein einfaches Robotermodell genannt<br />
educational Robot (Kurz eBot).<br />
Bei Semester- und Diplomarbeiten erlaubt das Gecko Konzept, dass sich die Studenten<br />
auf die eigenen Projektziele konzentrieren können, da die komplexesten Komponenten schon<br />
auf dem Gecko Modul vorhanden sind und nicht jedesmal eine komplette Neuentwicklung<br />
gemacht werden muss. So müssen nur noch die applikationsspezifischen Komponenten, wie<br />
Sensoren, Aktoren, Kommunikationsinterfaces, Leistungsstufen etc. hinzugefügt werden.<br />
1.2. Der Vorgänger: Gecko2<br />
Gecko2 folgte kurz nach der Entwicklung des ersten Gecko Moduls und unterscheidet sich<br />
davon hauptsächlich durch die zusätzliche USB 1.1 Schnittstelle, über die es möglich ist den<br />
FPGA zu konfigurieren und Daten mit dem PC auszutauschen. Das Modul wurde im Jahr<br />
2001 entwickelt.<br />
Das Gecko2 Modul bietet:<br />
• Xilinx Spartan2 FPGA mit 200 kGatter<br />
• Xilinx Platform Flash zur FPGA Konfiguration<br />
• Cypress EZ-USB Chip für die Kommunikation per USB 1.1<br />
• Zwei 64 K x 16 Bit SRAM<br />
• Sechs LEDs und ein Taster zur freien Nutzung<br />
• Zwei 64 Pin Stecker an denen Erweiterungen angeschlossen werden können<br />
• Kompakte Abmessungen (86x86 mm)<br />
Project Report 1
1. Überblick<br />
Die Möglichkeiten dieser Plattform sind vielfältig. Es steht ein Microchip PIC16C5X oder<br />
PIC16C7X kompatibler Mikrocontroller als IP-Core zur Verfügung. Das ganze System kann<br />
über die USB Schnittstelle programmiert werden und es können Daten mit dem Host PC ausgetauscht<br />
werden. Eine Anbindung an Matlab bzw. Simulink steht für den Gecko2 ebenfalls<br />
zur Verfügung.<br />
1.3. Die neue Generation<br />
Der Nachfolger, <strong>Gecko3</strong>, ist die Weiterentwicklung des bestehenden Konzeptes. Im Unterschied<br />
zum Vorgänger ist der <strong>Gecko3</strong> in einem grösseren Systemkonzept eingebunden, das<br />
noch weitere, in Planung befindliche, Hardwaremodule beinhaltet. Das Systemkonzept erlaubt<br />
es durch die verschiedenen Module und die Skalierbarkeit die ganze Anforderungsbreite,<br />
von der einfachen Unterrichtsplattform (auch fächerübergreifend) bis zur Hochleistungsplattform<br />
in den Bereichen Bildverarbeitung, Telekommunikation, Signalverarbeitung<br />
etc., zu erfüllen.<br />
In der Abbildung 1.1 ist der geplante Aufbau des neuen eBot dargestellt. Dieser Aufbau<br />
entspricht dem Vollausbau eines eBot. Im Minimum besteht der Roboter nur aus dem Chassis<br />
(mit Akku) und dem <strong>Gecko3</strong> bzw. Colibri Modul.<br />
Application Board<br />
15<br />
Application Board<br />
Colibri Arm Modul<br />
17<br />
Colibri Arm Modul<br />
<strong>Gecko3</strong> FPGA Modul<br />
11<br />
<strong>Gecko3</strong> FPGA Modul<br />
Rechargable Battery<br />
10<br />
(63)<br />
Rechargable Battery<br />
Power Board/Roboter Chassis 25<br />
Power Board<br />
Roboter Chassis<br />
85<br />
54<br />
Version 0.5, zimmc5, 15.6.2006<br />
Abbildung 1.1.: Aufbau des geplanten eBots (Vollausbau)<br />
Wie man sehen kann, ist das <strong>Gecko3</strong> nicht das einzige Modul, das “Intelligenz” beinhaltet,<br />
sondern es kann im Austausch oder gemeinsam mit dem Colibri Modul betrieben werden.<br />
Das Colibri ist ein komplettes Rechnermodul in der Grösse eines Notebook RAM Moduls<br />
und wird von der Schweizer Firma Toradex angeboten. Das Colibri beinhaltet einen Intel<br />
XScale Prozessor mit 312 MHz (ARM Kompatibel), RAM, Flash, Ethernet, Audio, Video<br />
und diverse weitere Schnittstellen.<br />
Dieses Modul wird parallel zu diesem Projekt in eine neue Unterrichtsplattformen für die<br />
Bereiche Embeddedsystems und Echtzeitbetriebssysteme integriert. Diese neue Plattform<br />
wird nun an den beiden Standorten Biel und Burgdorf für den Unterricht eingesetzt.<br />
Durch den einheitlichen Systembus und den gleichen Abmessungen, genau so klein wie<br />
eine Kreditkarte, der Module ist es für eine gegebene Problemstellung einfach, zwischen einer<br />
softwarezentrierten (Colibri) oder hardwarezentrierten Plattform (<strong>Gecko3</strong>) auszuwählen. Bei<br />
Bedarf kann die Plattform gewechselt werden oder bei steigenden Anforderungen können<br />
zusätzliche Module eingesetzt werden.<br />
2 Matthias Zurbrügg, Christoph Zimmermann
1.4. Funktionsumfang des <strong>Gecko3</strong> Boards<br />
Das Konzept einer einheitlichen Hardwareplattform kann bei Bedarf noch erweitert werden<br />
z. B. mit einem DSP Modul, das es erlauben würde, Algorithmen in Software oder Hardware<br />
zu implementieren und in der gleichen Applikation auszutesten.<br />
Das Roboterchassis für die neue Generation befindet sich auch in Entwicklung und soll<br />
den bestehenden eBot ersetzen.<br />
1.4. Funktionsumfang des <strong>Gecko3</strong> Boards<br />
<strong>Gecko3</strong> FPGA Modul<br />
Jtag<br />
Buttons<br />
& LEDs<br />
NOR<br />
Flash<br />
DDR<br />
SDRAM<br />
RJ45 &<br />
Magnetics<br />
(external)<br />
Ethernet<br />
PHY<br />
Xilinx FPGA<br />
Spartan3<br />
I/O’s<br />
RS232<br />
(external)<br />
Mini USB<br />
Cypress<br />
EZ-USB 2<br />
Config<br />
Flash<br />
EEPROM<br />
DC/DC<br />
Converter<br />
Abbildung 1.2.: Blockdiagramm des <strong>Gecko3</strong> Moduls<br />
Das <strong>Gecko3</strong> Projekt ist noch mitten in der Entwicklungphase und unsere Diplomarbeit<br />
deckt einen Teil davon ab. In der Abbildung 1.2 ist das Blockdiagramm des <strong>Gecko3</strong>s dargestellt.<br />
Die Planung des Funktionsumfangs, die Evaluation der Bauelemente und die Entwicklung<br />
des Schemas ist im Grossen und Ganzen abgeschlossen. Die Schemas und die Planung<br />
der Leiterplatte können dem Anhang F.1 und G entnommen werden.<br />
Der geplante Funktionsumfang des <strong>Gecko3</strong> Moduls beinhaltet:<br />
• Einfache Migration von Gecko2 Projekten<br />
• FPGA mit 1 bis 2 Mio. Gattern, je nach Bestückung<br />
• IP-Cores zur Peripherieansteuerung im Xilinx EDK enthalten und auf Opencores.org<br />
verfügbar<br />
• Systemspannung 3.3 V<br />
• Genügend RAM, so dass Linux lauffähig ist<br />
• Nichtflüchtiger Speicher genügend gross um Linux zu Booten<br />
• 32 Bit breiter Datenbus<br />
Project Report 3
1. Überblick<br />
• USB 2.0 anstatt USB 1.1 Schnittstelle<br />
• RS232 Schnittstelle<br />
• Ethernet Schnittstelle<br />
• Schnittstelle mit hoher Bandbreite zwischen Colibri und <strong>Gecko3</strong> bzw. zwischen zwei<br />
<strong>Gecko3</strong>s<br />
• Abmessungen so klein wie eine Visitenkarte (54 x 85 mm)<br />
• geringe Höhe (ca. 10 mm)<br />
4 Matthias Zurbrügg, Christoph Zimmermann
2. Definition der Diplomarbeit und<br />
Projekt Organisation<br />
Unsere Diplomarbeit deckt einen Teil der Entwickung der nächsten Gecko Generation ab.<br />
Unsere Aufgabe war es, die für dieses Board notwendige Software zu Programmieren. Im<br />
Detail umfasst dies die folgenden Teilziele:<br />
• USB Kommunikation Host PC mit dem Cypress EZ-USB<br />
• Konfiguration des FPGAs<br />
• Kommunikation mit dem FPGA, mit Fokus auf hohe Übertragunsgeschwindigkeit.<br />
• Ansteuerung des SPI Flash Speichers<br />
• Ansteuerung des I 2 C EEPROMs<br />
• Ansteuerung des NOR Flash Speichers<br />
• Definition des USB Protokolls zwischen Host und <strong>Gecko3</strong><br />
• Realisierung des stand-alone Betriebs ohne Host PC<br />
• Programmieren der Host PC Software und Beispielen für den Anwender<br />
• Test und Prüfung des Schemas der abgedeckten Teilsysteme<br />
• Betreuung des Layoutvorgangs der <strong>Gecko3</strong> Leiterplatte<br />
Zu Beginn der Diplomarbeit war das Projekt soweit Forgeschritten, dass die gesammte<br />
Evaluation, die Definition des Funktionsumfangs, die Schaltungsentwicklung und die mechanische<br />
Vorplanung abgeschlossen waren.<br />
Am Anfang unserer Diplomarbeit planten wir den ganzen Ablauf und die Arbeitsteilung<br />
unseres Projekts. Dazu erstellten wir zuerst eine Tabelle, die die Abhängigkeiten der Projektziele<br />
aufzeigte. Aufgrund dieser Tabelle entwarfen wir einen Zeitplan für unsere Diplomarbeit<br />
aus dem auch die Arbeitsaufteilung ersichtlich war. Die Dokumente der Projektplanung sind<br />
im Anhang A zu finden.<br />
Project Report 5
3. Entwicklungsumgebung<br />
3.1. Entwicklungshardware<br />
Die Hardware Entwicklung des <strong>Gecko3</strong> ist noch nicht abgeschlossen und es wurde auch noch<br />
kein Prototyp realisiert. Somit stand auch für unsere Diplomarbeit kein richtiges Zielsystem<br />
zum Programmieren zur Verfügung. Dazu kommt, dass die EZ-USB FX2 Chip Variante auf<br />
dem <strong>Gecko3</strong> so weit in der Funktionalität eingeschränkt ist, dass keine Möglichkeit mehr<br />
besteht die Software in einem Debugger laufen zu lassen.<br />
Unsere erste Aufgabe bestand also darin, eine Entwicklungshardware zusammen zu stellen<br />
die möglichst äquivalent zum geplanten <strong>Gecko3</strong> ist. Zur Verfügung standen uns zwei Spartan<br />
3 Starter Kits von Xilinx, die jeweils mit einem 200 kGatter FPGA bestückt sind, und ein<br />
EZ-USB FX2LP Development Kit von Cypress. Das EZ-USB FX2 Board und ein Xilinx<br />
Board bildeten die Basis für unsere Zielhardware.<br />
Diesen beiden Boards fehlen aber wesentliche Komponenten des <strong>Gecko3</strong>, welche über zwei<br />
zusätzliche Leiterplatten hinzugefügt werden. Die erste beherbergt das SPI Flash von ST und<br />
den I 2 C I/O-Chip von NXP. Diese wird an das EZ-USB Development Board angeschlossen.<br />
Die zweite Leiterplatte beherbergt zwei Intel NOR Flash Chips und wird an zwei Erweiterungsstecker<br />
des Spartan 3 Starter Kits angeschlossen (Schema im Anhang F.2), über den<br />
dritten Erweiterungsstecker wird der Spartan 3 FPGA mit dem EZ-USB verbunden.<br />
Die Verkabelung der zwei Board untereinander ist in der Tabelle B.1 aufgelistet. Ursprünglich<br />
war vorgesehen, dass in beiden Modi, Konfiguration wie Kommunikation, die Datenleitungen<br />
die selbe Nummer tragen um einheitlich zu bleiben. Wie den Xilinx Dokumenten<br />
([NP02] und [Tse04]) zu entnehmen ist, muss bei der Konfiguration jedes Byte im Bitstrom<br />
in seiner Reihenfolge umgedreht werden (Das MSB muss an den FPGA Anschluss D0 und<br />
das LSB an D7). Da diese Operation mit Software sehr ineffizient zu lösen ist und die FPGA<br />
Datenleitungen nach der Konfiguration frei belegbar sind, haben wir uns entschieden, einfach<br />
die Verbindungen umzudrehen, D0 vom EZ-USB ist so mit D7 des FPGAs verbunden. Der<br />
Anwender merkt im Kommunikationsmodus nichts davon solange er sich an die Pinbelegung<br />
in der Tabelle hält. Um uns etwas Verdrahtungsarbeit zu ersparen und der ganze Aufbau etwas<br />
übersichtlicher zu machen, haben wir uns entschieden den Kommunikationsmodus auch<br />
nur auf dieser 8 Bit Busbreite zu betreiben (6.7.3).<br />
Das EZ-USB Development Kit wird normalerweise über die USB Schnittstelle versorgt.<br />
Damit ein stand-alone Betrieb realisiert werden konnte, musste die Stromversorgung der<br />
beiden Boards verbunden werden. Das Netzteil des Spartan 3 Starter Kits versorgt nun die<br />
ganze Entwicklungshardware. Um Störungen zu reduzieren wurden zwei Drosselspulen in die<br />
Versorgungsleitungen zum EZ-USB Board eingebaut.<br />
Zur Überprüfung und Fehlersuche stand uns ein Logic Analyser HP 16500B (80 Kanäle,<br />
100 MHz) und ein Speicheroszilloskop Tektronix TDS 754C (4 Kanal, 2 GSamples /s) zur Verfügung.<br />
Unsere Entwicklungshardware deckt nicht den vollständigen Funktionsumfang des <strong>Gecko3</strong><br />
Boards ab. In der Graphik 3.1 sind die Funktionsblöcke dunkel hervorgehoben welche unsere<br />
6 Christoph Zimmermann
3.2. Entwicklungssoftware<br />
Hardware bereitstellt.<br />
3.2. Entwicklungssoftware<br />
Wir benutzten in unserer Diplomarbeit mehrere Programmiersprachen und Zielsysteme. Dies<br />
erforderte den Einsatz von mehreren Entwicklungsumgebungen. Wir setzten Keils µVision2<br />
zur EZ-USB Firmware Entwicklung in C ein und den GPIF Designer um die Statemachines<br />
zu definieren. Die Hostsoftware unter Linux wurde mit KDevelop3 in C++ programmiert.<br />
Die FPGA Cores wurden in VHDL mit Hilfe des Xilinx ISE 8.2i Foundation modeliert und<br />
simuliert.<br />
Die <strong>Gecko3</strong> Hardware wird mit Protel DXP, bis jetzt mit der Version 2002, entwickelt.<br />
3.3. Inbetriebnahme<br />
Der Aufbau und die Inbetriebnahme der Entwicklungsumgebung hatte kleine Tücken. So<br />
musste zuerst herausgefunden werden, wer an der Fachhochschule Biel die Lizenzen für das<br />
Keil µVision verwaltet, da im Unterricht nur die Demoversion verwendet wird und nur<br />
eine Handvoll Lizenzen vorhanden sind. Später wurde festgestellt, dass der Lizenz Dongle<br />
von Keil nicht zusammen mit dem Parallelport JTAG Kabel von Xilinx funktioniert. Zum<br />
Glück standen im Microlab zwei USB JTAG Kabel zur Verfügung, mit denen das Problem<br />
umgangen werden kann.<br />
Der Test des EZ-USB Development Kits war die nächste Überraschung, da der Debugger<br />
unser Board einfach nicht erkennen wollte. Nach einem ganzen Tag suchen, testen und vergleichen<br />
stand am Schluss fest, dass von Cypress ein falsch verdrahtetes RS232 Kabel dem<br />
Development Kit beigelegt wurde.<br />
Verwirrung bestand bis am Schluss, welche Version des Cypress EZ-USB Control Panel<br />
jetzt mit welchem Beispiel und welchem Firmware Framework zu verwenden ist. Die mitge-<br />
<strong>Gecko3</strong> FPGA Modul<br />
Jtag<br />
Buttons<br />
& LEDs<br />
NOR<br />
Flash<br />
DDR<br />
SDRAM<br />
RJ45 &<br />
Magnetics<br />
(external)<br />
Ethernet<br />
PHY<br />
Xilinx FPGA<br />
Spartan3<br />
I/O’s<br />
RS232<br />
(external)<br />
Mini USB<br />
Cypress<br />
EZ-USB 2<br />
Config<br />
Flash<br />
EEPROM<br />
DC/DC<br />
Converter<br />
Abbildung 3.1.: Abdeckung unserer Entwicklungshardware im Vergleich zum <strong>Gecko3</strong><br />
Project Report 7
3. Entwicklungsumgebung<br />
Abbildung 3.2.: Xilinx Spartan 3 Starter Kit<br />
Abbildung 3.3.: Cypress EZ-USB FX2LP Development<br />
Kit<br />
8 Christoph Zimmermann
3.3. Inbetriebnahme<br />
lieferten Beispiele auf der EZ-USB FX2LP Development Kit CD funktionieren nur mit der<br />
Vorgängerversion die wir auf der CD des Xcelerator Development Kits gefunden haben. Die<br />
Informationen von Cypress zu diesem Thema fehlen komplett. Wir empfehlen weiterhin das<br />
alte Control Panel zu verwenden, da die Beispiele der EZ-USB FX2LP CD nur damit verwendet<br />
werden können und auch Cypress gemäss den Screenshots in ihren Dokumentationen<br />
noch mit dieser Version arbeitet.<br />
Der I 2 C I/O-Chip konnte nicht benutzt werden, da von NXP falsche Muster geliefert<br />
wurden. Dies wurde leider erst bemerkt als der Chip benutzt werden sollte. So war es während<br />
der Diplomarbeit leider nicht mehr möglich einen richtigen Chip zu bekommen.<br />
Project Report 9
4. Kommunikation zwischen EZ-USB und<br />
FPGA<br />
Bei der Kommunikation mit dem FPGA geht es darum, dem Benutzer eine transparente<br />
Verbindung zwischen Host und dem Spartan 3 über die USB 2.0 Schnittstelle zur Verfügung<br />
zu stellen. Dafür wurde ein eigenes Handshake-Protokoll zwischen dem EZ-USB FX2 und<br />
dem FPGA definiert. Mit dem EZ-USB FX2 ist dabei nur das General Purpose Interface<br />
(GPIF) gemeint, das vom Handshaking betroffen ist und im Unterkaptiel 6.7 erklärt wird.<br />
Die Abbildung 4.1 illustriert das Blockdiagramm des Handshaking.<br />
Abbildung 4.1.: Handshake Blockdiagramm<br />
4.1. Handshake-Protokoll<br />
Unser Handshake-Protokoll basiert auf dem Prinzip des vier Phasen Handshaking [Jac]. Nur<br />
ist in unserem Fall kein fester Master und Slave definiert. Somit muss zuerst kontrolliert<br />
werden ob der Bus frei ist. Dann sendet der Initiator, also der momentane Master, einen<br />
Request und erwartet die Bestätigung vom temporären Slave. Erst nach diesem Bus-Handling<br />
werden die Daten vom Sender an den Bus gelegt.<br />
Der Slave empfängt die Daten und bestätigt seinen abgeschlossenen Lesevorgang, indem<br />
er seine Bestätigung wieder löscht. Wenn noch weitere Daten zu senden sind wird die ganze<br />
Prozedur wiederholt bis die Informationen vollständig übertragen sind. Das Ende einer<br />
Übertragung wird mit einer Regelverletzung angezeigt. Der Initator setzt sein Ready-Flag<br />
und verstösst somit gegen die Regeln des Handshake-Protokolls. Der Slave erkennt somit das<br />
Ende einer Übertragung und setzt ebenfalls sein Ready-Flag. Nachdem zuerst der Master<br />
und dann der Slave ihre Bestätigungen löschen, kehrt das GPIF in den Idle State zurück.<br />
Die Abbildung 4.2 zeigt das Handshaking einer Datenübertragung vom EZ-USB FX2 zum<br />
FPGA.<br />
10 Matthias Zurbrügg
4.1. Handshake-Protokoll<br />
Abbildung 4.2.: Flussdiagramm vom EZ-USB Richtung FPGA<br />
Um die bidirektionale Datenübertragung zu vervollständigen, ist in Abbildung 4.3 noch<br />
eine Datenübertragung vom FPGA zum EZ-USB dargestellt. Das Handshaking kümmert sich<br />
Abbildung 4.3.: Flussdiagramm vom FPGA Richtung EZ-USB<br />
nicht um die Länge der übertragenen Daten. Wenn vom Host die Daten gesendet werden, ist<br />
das kein Problem da unser Protokoll, solange sendet bis der FIFO Buffer nicht mehr gefüllt<br />
wird. In der entgegengesetzten Richtung ist das jedoch problematisch, da beim Bulk-Transfer<br />
Verfahren (siehe Kapitel 6.2) der Host dem EZ-USB FX2 mitteilen muss wieviele Byte er<br />
Project Report 11
4. Kommunikation zwischen EZ-USB und FPGA<br />
lesen will. Momentan kommunizieren wir noch über einen Loopback Core im FPGA (siehe<br />
Kapitel 5.1), das heisst die Datenmenge, die gesendet wird, kommt auch wieder zurück.<br />
Somit wissen wir natürlich wieviel der Host lesen will. Bei einer anderen Konfiguration muss<br />
er aber vor der Übertragung wissen wieviele Daten der FPGA senden will.<br />
Diese Aufgabe soll später ein Protokoll eine Ebene über dem Handshaking übernehmen.<br />
Dieses Protokoll existiert noch nicht, doch erste Überlegungen haben uns mehrere Möglichkeiten<br />
aufgezeigt:<br />
• Die Firmware teilt dem Host vor jedem Transfer den FIFO Füllstand mit einem Vendor<br />
Request mit.<br />
• Der FPGA versieht den Datenstrom mit einer Endmarke. Der Host liest dann immer<br />
den gesammten Inhalt des FIFO Buffers und sucht nach der Endmarke.<br />
• Es wird eine feste Länge der Datenpakete definiert. Der FPGA würde dann nicht<br />
gefüllte Datenpakete mit Dummy-Informationen ergänzen.<br />
Die zwei letzten Möglichkeiten sind ähnlich, wobei die dritte Variante einen höheren Aufwand<br />
für den FPGA bedeutet. Doch die beste Lösung für dieses Problem zu finden ist Teil<br />
einer nächsten Arbeit.<br />
Die Signalisation des Datenendes durch eine Regelverletzung haben wir wegen der fehlenden<br />
RDY-Leitung realisiert. Diese Leitungen sind neben den zwei internen Flags die einzigen<br />
Inputs die vom GPIF eingelesen werden können. Da wir auf dem <strong>Gecko3</strong> die kleinste Version<br />
des EZ-USB FX2 einsetzen, haben wir nur zwei RDY-Leitungen zur Verfügung, welche aber<br />
schon von unserem Handshaking genutzt werden. Somit bleiben keine weiteren Eingänge,<br />
die vom GPIF genutzt werden können.<br />
Eine weitere Möglichkeit wäre eine Endsignalisation mit Hilfe eines Interrupts zu realisieren<br />
und das GPIF somit manuell aus der Firmware abzubrechen. Diese Lösung erschien<br />
uns jedoch als unstrukturiert, weil der Mikrokontroller in den Kommunikationsablauf eingreifen<br />
müsste. Diese Unabhängikeit von der Firmware bezahlen wir jedoch mit einem etwas<br />
aufwändigerem Handshaking, das am Ende der Übertragung etwas länger ist und somit<br />
die Datenrate etwas dämpft. Je grösser aber die Datenpakete sind, desto seltener werden<br />
die Endsignalisationen. Somit wird auch deren negativer Einfluss auf die Datenrate immer<br />
kleiner.<br />
12 Matthias Zurbrügg
5. VHDL<br />
In diesem Kapitel beschreiben wir die Entwicklungen die wir für den FPGA gemacht haben.<br />
Es wurde alles in VHDL im Xilinx ISE programmiert [Sch03]. Auch zur Simulation wurde<br />
das ISE benutzt. Als Synthesewerkzeug kam Xilinx XST zum Einsatz.<br />
Wie aus dem Projektplan ersichtlich ist, waren weitere Cores geplant, konnten aber in<br />
der zur Verfügung stehenden Zeit nicht mehr realisiert werden. Darum folgt hier nur die<br />
Beschreibung des Loopback Cores.<br />
5.1. Kommunikations Loopback<br />
5.1.1. Zweck und Anforderungen<br />
Der Loopback Core dient zum Entwickeln und Testen der Kommunikation zwischen dem<br />
FPGA und dem EZ-USB Chip. Er stellt also eine einfache Implementierung des im Kapitel<br />
4 beschriebenen Handshake-Protokolls dar. Die Daten die vom EZ-USB gesendet werden,<br />
müssen bis zum Abschluss der Sequenz gespeichert werden und sollen danach zurückgesendet<br />
werden. Dies ermöglicht eine Überprüfung der gesendeten Daten und beider Kommunikationswege.<br />
Der Core muss Sequenzen speichern können, die länger als ein Wort sind, da in<br />
der Anwendung normalerweise grössere Datenmengen ausgetauscht werden sollen und die<br />
USB Schnittstelle nur bei grösseren Datenblöcken die hohen Datenraten erreicht. Die VHDL<br />
Sourcecodes sind im Anhang ab E.2 zu finden.<br />
5.1.2. Realisierung<br />
Dem Loopback Core liegt ein klassischer FSM-D (Finite-State-Machine/Datapath) Ansatz<br />
zu Grunde. Diesem Ansatz folgend wurde zuerst der Datenpfad erstellt. Als zentrales Element<br />
dient ein Block RAM Element. Block RAMs sind direkt als Hardware im Spartan 3 integriert<br />
und müssen nicht synthetisiert werden. Der Vorteil dabei ist, dass keine Speicherstruktur<br />
erzeugt werden muss. Das spart Zeit bei der Entwicklung und schont die FPGA Ressourcen,<br />
da diese ineffizent für regelmässige Strukturen sind. Der Nachteil daran ist die Abhängigkeit<br />
der Zielplattform, da Block RAMs nur in Xilinx FPGAs (Spartan 3 oder Virtex 2 und<br />
höher) vorhanden sind. Der Rest des Datenpfads besteht aus einem Auf-/Abwärtszähler als<br />
Adressgenerator, einem Nulldetektor und dem Tri-State Buffer für den Datenbus.<br />
Die Statemachine wurde anschliessend im Xilinx ISE mit Hilfe des Programms StateCAD<br />
gezeichnet. Dieses erlaubt die graphische Eingabe der Zustände, den Übergängen, der Signalwerte<br />
und den Bedingungen und generiert daraus wahlweise VHDL oder Verilog Code.<br />
Dieser Weg wurde zum einen aus Neugier an der graphischen Eingabe gewählt und zum<br />
anderen weil Änderungen einfacher vorgenommen werden können. Damit muss die Dokumentation<br />
(State <strong>Event</strong> Diagramm) nicht separat erstellt werden und ist immer aktuell. Die<br />
so erstellte Statemachine ist in Abbildung 5.2 dargestellt.<br />
Project Report 13
5. VHDL<br />
Die Statemachine übernimmt die Abhandlung des Handshake-Protokolls mit dem EZ-USB<br />
und steuert dementsprechend die Signale des Datenpfads. Durch die sehr einfache Implementierung<br />
wird beim Empfangen der Adresszähler hinauf- und beim Senden heruntergezählt.<br />
Dadurch werden die Daten in umgekehrter Reihenfolge zurückgesendet (LIFO).<br />
Das in Abbildung 5.1 dargestellte Topmodul des Loopback enthält ein entscheidendes<br />
Element, das nach den Tests mit dem EZ-USB hinzugefügt werden musste: Zwei zusätzliche<br />
Buffer, die die Handshake Eingangssignale zwischenspeichern bevor sie zur Statemachine<br />
gelangen. Diese sind nötig, weil wir bei Messungen festgestellt haben dass wir mit Metastabilität<br />
zu kämpfen haben. Dies wird durch unser asynchrones System ausgelöst und kann nicht<br />
verhindert werden. Mit Hilfe des Double-Bufferings kann das Risiko Metastabilerzustände<br />
massiv reduziert werden [Cad00]. Dies wurde auch durch unsere Tests bestätigt.<br />
Dieser Core ist nur eine “Testschaltung”, eine Implementierung für eine Applikation muss<br />
sicher um zusätzliche Elemente zur Fehlerbehandlung, Prüfung des Speicherfüllstands und<br />
einem Watchdog ergänzt werden.<br />
5.1.3. Testbench und Simulationsergebnis<br />
Für die Progammierung der Testbench wurde ein anderer Codierstil gewählt, da Core und<br />
Testbench von der gleichen Person erstellt wurden. Dieses Vorgehen reduziert die Wahrscheinlichkeit,<br />
dass sich ein Fehler sowohl in den Core wie auch in die Testbench einschleicht<br />
und bis am Schluss unentdeckt bleibt.<br />
Abbildung 5.1.: Schema der höchsten Ebene des Loopback Cores<br />
14 Christoph Zimmermann
5.1. Kommunikations Loopback<br />
Abbildung 5.2.: Statemachine des Loopback Cores<br />
Abbildung 5.3.: Signalverlauf der Simulation<br />
des Loopback<br />
Cores<br />
Project Report 15
5. VHDL<br />
Die Testbench simuliert das System mit einem Takt von 50 MHz wie er auf dem Spartan<br />
3 Starter Kit vorhanden ist und auf dem <strong>Gecko3</strong> vorgesehen ist. Aus der Simulation kann<br />
die mögliche Datenrate des Loopback Cores herausgelesen werden. Für die Übertragung<br />
von 512 16 Bit Worten zum FPGA sind in der Simulation 82 µs nötig, das entspricht einer<br />
Datenrate von 99.9 Mbit /s. Um die selbe Datenmenge von 512 16 Bit Worten aus dem FPGA<br />
herauszulesen werden 92.2 µs benötigt, das entspricht 88.87 Mbit /s. Dieser Unterschied kommt<br />
durch die Testbench zustande. Diese könnte noch optimiert werden, damit sie weniger lang<br />
wartet um die Daten zu übernehmen und so den Empfang schneller bestätigt.<br />
Die Messungen auf der Hardwareplattform zeigten, dass die Testbench zu wenig an das<br />
vorhandene System angepasst wurde. Die Testbench simuliert ein synchrones System. Die<br />
Funktionsprüfung des Loopback Cores vereinfachte sich zwar ein wenig aber in der Praxis<br />
zeigte sich, dass die Simulation versagt hat, weil der Core erst nach weitern Änderungen<br />
funktionierte.<br />
16 Christoph Zimmermann
6. Firmware<br />
Der EZ-USB FX2 hat neben seiner USB Peripherie einen 8051 Mikroprozessor integriert, was<br />
eine Implementation der Firmware im C Code ermöglicht. Die Firmware kann direkt vom<br />
Host über USB oder beim Booten vom EEPROM via I 2 C ins intern RAM geladen werden.<br />
Die zweite Variante setzt voraus, dass vor dem Reset des EZ-USB FX2 die Firmware ein<br />
bootfähiges Abbild von sich im EEPROM abgespeichert hat.<br />
Die erste Version unserer Gecko Firmware kann folgende Grundfunktion ausführen:<br />
• FPGA direkt vom Host über USB konfigurieren<br />
• Bootfähige Firmware vom Host via USB ins EEPROM schreiben<br />
• wählbare Anzahl Byte aus EEPROM lesen und über USB an Host senden (zum Debuggen)<br />
• FPGA Konfiguration vom Host über USB ins SPI Flash schreiben<br />
• feste Anzahl Byte aus SPI Flash lesen und via USB an Host senden (zum Debuggen)<br />
• nach einem Booten aus dem EEPROM automatisch den FPGA aus dem SPI Flash<br />
konfigurieren<br />
• Kommunikation zwischen Host und FPGA<br />
• Rückgabe der Firmware Version bei der Anfrage des Hosts<br />
6.1. Programmstruktur<br />
Cypress empfiehlt die Firmware in ihrem vorbereiteten µVision2 Projekt zu integrieren,<br />
was wir auch gemacht haben. Das Projekt findet man nach der Installation der Cypress<br />
Development Kit Software im Ordner Target und enthält folgende Dateien:<br />
• Fw.c ist das Cypress Firmware Framework, welche das USB Handling (Interrupts, Enumeration,<br />
Renumeration etc.) übernimmt. Darin enthalten ist auch die C-Grundfunktion<br />
main(). Cypress empfiehlt den Code in dieser Datei nicht zu editieren. Alle für den Programmierer<br />
nötigen Veränderungen sollen in der Periph.c gemacht werden.<br />
• Periph.c enthält schon eine Vielzahl von vordefinierten Funktionen. Wir verwenden in<br />
unserer Firmware die Initialisierungsfunktion, welche einmal von Fw.c aufgerufen wird,<br />
die Funktion TD Poll(), die regelmässig aus dem main() gestartet wird und die definition<br />
der Vendor Requests. Den restlichen Code im Periph.c haben wir so belassen wie<br />
er von Cypress vorbereitet wurde. Somit können später Änderungen gemacht werden,<br />
ohne das ein Einblick in das original µVision2 Projekt nötig ist.<br />
• Gpif.c wird vom GPIF Designer erstellt und enthält die Waveform Descriptor Tables.<br />
Project Report 17
6. Firmware<br />
• Ezusb.lib enthält eine Sammlung von Funktionen wie das Lesen und Schreiben des I 2 C<br />
Buses etc.<br />
• USBJmpTb.obj beinhaltet die Interrupt Vector Tables für das USB (INT2) und das<br />
GPIF (INT4).<br />
• Dscr.a51 definiert die gesamten USB Descriptor Tables.<br />
6.2. USB organisation<br />
Der gesamte Datenaustausch läuft bei USB über sogenannte Endpoints (EP). Diese Endpoints<br />
sind mit einer Ausnahme alle unidirektional und ermöglichen einen voneinander unabhängigen<br />
Datenfluss. Der Endpoint 0 ist für Steuerfunktionen, sogenannte Vendor Requests,<br />
reserviert und bidirektional. Die folgende Aufliestung gibt einen Überblick über die<br />
von uns verwendeten Endpoints. Um mehr Informationen zum Thema USB zu erhalten,<br />
verweisen wir auf die einschlägige Literatur [Hyd99], [Cyp06].<br />
• EP0 wird als IN/OUT Endpoint benutzt und ist für Vendor Requests reserviert.<br />
• EP2 ist als OUT Endpoint konfiguriert und wird für alle Datentransfers ausser der<br />
Kommunikation mit dem FPGA verwendet<br />
• EP4 hat die selbe Aufgabe wie EP2 nur als IN Endpoint in die entgegengesetzte Richtung.<br />
• EP6 ist der OUT Endpoint der FPGA Kommunikation und direkt mit dem GPIF<br />
verbunden.<br />
• EP8 hat die selbe Aufgabe wie EP6 nur als IN Endpoint in die entgegengesetzte Richtung.<br />
EP2 und EP4 sind dabei als Interface 0 und EP6 und EP8 als Interface 1 definiert. Im<br />
Kapitel 7 wird das Thema Interfaces ausführlich erklärt. Die Endpoints werden im Bulk-<br />
Transfer Modus betrieben. Bulk-Transfers sind für grosse Datenmengen gedacht, die jedoch<br />
nicht zeitkritisch sind. Diese Eigenschaften sind am besten für unsere Verwendung geeignet<br />
und schliessen die anderen Transferarten aus. Jeder Endpoint ist dabei so konfiguriert, dass<br />
er einen zweimal 512 Byte grossen Buffer besitzt. In diesem Abschnitt ist mit Endpoints<br />
jeweils EP2, EP4, EP6 und EP8 gemeint. Im Technical Reference Manual von Cypress<br />
[Cyp06] können die Konfigurationsmöglichkeiten der Endpoints nachgeschlagen werden. Die<br />
Abbildung 6.1 gibt noch einmal einen gesamt Überblick über die Endpoints und deren Konfigurationen.<br />
18 Matthias Zurbrügg
6.3. Grundstruktur der Firmware<br />
Abbildung 6.1.: Organisation der Endpoints<br />
6.3. Grundstruktur der Firmware<br />
Die eigentliche Hauptfunktion unserer Firmware ist TD Poll(), da dies vom Cypress Framework<br />
so festgelegt wird. TD Poll() wird wie im Unterkapitel 6.1 erwähnt, regelmässig<br />
aufgerufen. Bei jedem Aufruf wird geprüft, ob Daten am EP2 bereitstehen. Falls das zutrifft<br />
wird eine vom Vendor Request abhängige Aktion durchgeführt bzw. die entsprechende<br />
Funktion aufgerufen. Danach wird der EP6 auf seinen Dateninhalt kontrolliert. Wenn Daten<br />
vorhanden sind, wird die GPIF Schreibefunktion für einen Datentransfer zwischen dem<br />
EP6 FIFO Buffer und dem FPGA gestartet. Am Schluss von TD Poll() wird noch die GPIF<br />
Lesefunktion aufgerufen um zu schauen ob der FPGA Daten an den Host senden will. Das<br />
in Abbildung 6.2 dargestellte Flussdiagramm zeigt den Programmablauf bei einem Aufruf<br />
von TD Poll().<br />
Project Report 19
6. Firmware<br />
Abbildung 6.2.: Grundstruktur der Firmware<br />
20 Matthias Zurbrügg
6.4. FPGA Konfiguration<br />
6.4. FPGA Konfiguration<br />
Es gibt mehrere Möglichkeiten den FPGA mit einem Mikrokontroller zu konfigurieren. Wir<br />
wählten dafür den Slave Parallel Mode, da unser FPGA über 16 Datenleitungen mit dem<br />
EZ-USB FX2 verbunden ist. Je nach Literatur wird diese Konfigurationsart auch Select-<br />
MAP Mode genannt und ist im Application Note von Xilinx [NP02] erklärt. Wichtig ist zu<br />
beachten, dass in diesem Modus die Daten Byte-Swapped über die Datenleitungen gesendet<br />
werden müssen. Dieses Problem wurde mit einer Hardwareänderung gelöst und ist im<br />
Unterkapitel 3.1 schon beschrieben.<br />
Der FPGA kann von der Firmware über zwei Wege konfiguriert werden. Entweder man<br />
sendet die Konfiguration direkt vom Host über USB zum FPGA oder der EZ-USB FX2 wird<br />
im stand-alone Betrieb gestartet. In diesem Fall wird er die Firmware über I 2 C in sein RAM<br />
laden. Anschliessend beschreibt die Firmware in der Initialisierungsphase den FPGA mit<br />
dem Inhalt des SPI Flashs. Dieser Konfigurationsvorgang wird im Kapitel 6.5 behandelt.<br />
Dieses Kapitel beschreibt nur die direkte Konfiguration vom Host.<br />
Die Konfigurationssequenz wird mit einem Vendor Request vom Host gestartet. Um welchen<br />
Request es sich dabei handelt, ist im Unterkaptiel 6.8 beschrieben. Manche Pins und<br />
Register werden vom GPIF und der Konfigurationsfunktion verwendet. Per Default ist der<br />
EZ-USB FX2 für die Verwendung des GPIFs initialisiert. Deshalb wird als erstes eine kleine<br />
Funktion aufgerufen, welche den EZ-USB FX2 zum Konfigurieren des FPGAs initialisiert.<br />
Erst jetzt wird die eigentliche Funktion für die Konfiguration aufgerufen.<br />
Zuerst bringt die Firmware den CS B und den RDWR B Pin low. Mit dem anschliessenden<br />
Löschen des Prog B Pins resetet man den FPGA. Nachdem Prog B wieder gesetzt wird, geht<br />
der FPGA in den Configuration Load Modus. Dieser Zustand signalisiert der Spartan 3 mit<br />
dem setzen des INIT B Pins. Nun ist er bereit die Konfigurationsdaten zu empfangen.<br />
Während dieser Phase bleibt die Firmware in dieser Funktion, bis die Anzahl der vom<br />
USB empfangenen Byte der Grösse der FPGA Konfigurationsdatei entspricht. Diese Datei<br />
sendet die Hostsoftware ohne Header und hat somit für den selben FPGA Typ immer die<br />
selbe Länge. Diese Länge muss jedoch im Sourcecode definiert werden. Nun wird festgestellt<br />
ob Daten im EP2 vorhanden sind bzw. der Host neue Daten gesendet hat. Wenn dies zutrifft,<br />
liest die Firmware das Byte Counter Register des EP2 FIFO Buffers ein und aktualisiert den<br />
Zähler, der die empfangenen Byte erfasst. Danach wird das erste Byte im FIFO Buffer an den<br />
Datenbus gelegt. Bei einem Impuls an der CCLK Leitung liest der Spartan 3 das Byte ein.<br />
Um das nächste Byte im FIFO Buffer auf den Datenbus zulegen, muss die Firmware keine<br />
Adresse inkementieren. Dies geschieht mit dem Autopointer bei jedem Zugriff automatisch.<br />
Unsere Firmware arbeitet beim EP2 und EP4 ausschliesslich mit diesem Feature. Die genaue<br />
Funktion des Autopointers ist im Technical Reference Manual [Cyp06] beschrieben.<br />
Diese Sendesequenz wird nun solange wiederholt bis der Inhalt des FIFO Buffers übertragen<br />
ist. Sollte der FPGA den Busy Pin setzten, ist ein weiterer Clock-Impuls nötig und<br />
solange zu wiederholen, bis er wieder bereit ist neue Daten anzunehmen. Der Busy-Check<br />
ist optional, da der FPGA mit einem schnelleren Takt arbeitet als der EZ-USB FX2. Somit<br />
wird es wahrscheinlich nie vorkommen, dass der Mikrokontroller den Spartan 3 überfordert.<br />
Doch um eine zuverlässige Konfiguration zu garantieren haben wir die Abfrage des Busy<br />
Pins dennoch implementiert.<br />
Der Busy-Check wird uns jedoch am Ende der Konfiguration zum Verhängnis. Die letzten<br />
16 Byte der Datei sind Dummy-Information. Deshalb ist der FPGA schon vor dieser Sequenz<br />
fertig konfiguriert und treibt den Busy Pin, in Abhänigkeit der Pinbelegung des VHDL<br />
Project Report 21
6. Firmware<br />
Codes, auf einen unbestimmten Wert. Wenn der Pin nun auf high ist, würden wir in der<br />
Busy-Abfrage bleiben. Deshalb ist zusätzlich eine Kontrolle des Done Pins nötig um in<br />
diesem Fall die Sequenz zu verlassen.<br />
Wenn ein EP2 FIFO Buffer vollständig übertragen ist, muss er geladen werden damit ihm<br />
der Host neuen Daten sendet.<br />
Ist die Konfiguration abgeschlossen, setzt die Firmware CS B und der RDWR B wieder auf<br />
high. Die folgenden vier zusätzlichen Impulse auf der CCLK Leitung schliessen die Startup<br />
Sequenz ab. Am Schluss werden die Variablen wieder mit ihren Initialwerten definiert und die<br />
GPIF Initialisierung aufgerufen um die doppelt verwendeten Pins wieder auf den Gebrauch<br />
des GPIFs zu setzten.<br />
Abbildung 6.3.: FPGA Konfiguration über Host<br />
22 Matthias Zurbrügg
6.5. Stand-alone Betrieb<br />
6.5. Stand-alone Betrieb<br />
Die Firmware muss im EEPROM gespeichert werden, damit eine stand-alone Betrieb möglich<br />
ist. Beim Aufstarten kontrolliert der Mikrokontroller über I 2 C, ob eine bootfähige Firmware<br />
im EEPROM vorhanden ist [Cyp06]. Bootfähig heisst der C-Code wird nicht im Intel Hex-<br />
Format gespeichert sondern im Binary Format. Dazu muss noch eine definierte Kopf- und<br />
Fusszeile eingefügt werden. Um das Erstellen dieser Datei braucht sich der Programmierer<br />
nicht zu kümmern. Bei jeder Kompilation im µVision2 wird die kleine Cypress Software<br />
hex2bix.exe aufgerufen, welche die Hex-Datei umwandelt und als .iic Datei abspeichert.<br />
Dieser Vorgang ist im Angang C beschrieben.<br />
6.5.1. EEPROM beschreiben<br />
Mit dem entsprechenden Vendor Request startet man die Funktion zum Beschreiben des<br />
EEPROMs. Zuerst wird die Speicheradresse, von wo aus das EEPROM beschrieben werden<br />
soll, auf 0 gesetzt. Danach verweilt die Firmware solange in der Funktion bis der EP2 keine<br />
Daten mehr erhält. Es wird wieder die Anzahl Byte im FIFO Buffer eingelesen und im EP2<br />
Zähler gespeichert. Wenn dessen Inhalt grösser als 64 Byte ist, begrenzen wir die Schleife,<br />
die den EP2 Inhalt in das Array speichert, auf 64 Durchläufe. Dies ist die maximal mögliche<br />
Datenmenge, die man mit einem sogenannten Page Write Befehl des EEPROMs übertragen<br />
darf [Mic]. Das Zwischenspeichern in einem Array ist nötig um mit der I 2 C Schreibefunktion<br />
von Cypress arbeiten zu können. Die abgespeicherten 64 Byte werden jetzt von der gesamt<br />
Anzahl Byte im EP2 Zähler abgezählt. Danach senden wir den Arrayinhalt über den I 2 C und<br />
berechnen die neue Speicheradresse, von welcher aus beim nächsten Durchlauf der Sequenz<br />
das EEPROM beschrieben werden soll. Wir haben beim ersten Durchlauf die Daten in die<br />
Speicheradressen 0 bis 63 geschrieben, folglich wird die nächste Adresse 64 sein. Dieser<br />
Vorgang wiederholt die Firmware solange bis der Wert im EP2 Zähler kleiner als 65 Byte<br />
ist. Die Anzahl Durchläufe der Speicherschleife wird nun auf den EP2 Zählerwert gesetzt,<br />
da sowieso höchstens noch 64 Byte, also die maximal erlaubte Datenmenge, im FIFO Buffer<br />
vorhanden sind. Wir speichern noch einmal den EP2 Inhalt in das Array und speichern ihn<br />
im EEPROM. Danach ist der Schreibevorgang aber noch nicht abgeschlossen sondern erst<br />
der FIFO Buffer übertragen. Der EP2 wird wieder geladen und ist nun für neue Daten vom<br />
Host bereit. Ist die Datei vollständig im EEPROM gespeichert, erhält der EZ-USB FX2<br />
vom Host einen entsprechenden Vendor Request als Bestätigung. Dieser setzt gleichzeitig<br />
die Variabeln der Funktion auf ihre Initialwerte.<br />
Project Report 23
6. Firmware<br />
Abbildung 6.4.: EEPROM beschreiben<br />
24 Matthias Zurbrügg
6.5. Stand-alone Betrieb<br />
6.5.2. EEPROM auslesen<br />
Zum Debuggen kann mit der Lesefunktion der Inhalt des EEPROMs ausgelesen und über<br />
USB zum Host gesendet werden. Dies ist jedoch erst mit dem EZ-USB Control Panel von<br />
Cypress möglich. Unsere Hostsoftware macht von dieser Funktion der Firmware noch keinen<br />
Gebrauch. Wie immer startet ein Vendor Request den Lesevorgang. Im Initialisierungsmode<br />
wird definiert, dass das EEPROM von der Speicheradresse 0 ausgelesen werden soll. Danach<br />
muss diese Adresse dem EEPROM mit einem Write-Befehl mitgeteilt werden. Nun lesen<br />
wir den Wert ein, der mit dem Vendor Request mitgesendet wird. Dieses Datenwort entspricht<br />
der Anzahl Byte, die der Anwender aus dem EEPROM auslesen will. Danach wird<br />
der Lesemodus aktiviert. Das Prinzip des Auslesens beruht auf der im Unterkapitel 6.5.1 beschriebenen<br />
Schreibesequenz und wird daher nicht mehr im Detail beschrieben. Der einzige<br />
Unterschied ist, dass beim Lesen des EEPROMs die Datenmenge die man auf einmal lesen<br />
darf, nicht begrenzt ist. Es werden trotzdem nur 64 Byte Pakete ausgelesen, damit man das<br />
Buffer Array der Schreibefunktion verwenden kann. Wenn der EP4 FIFO Buffer mit den<br />
gewünschten Daten gefüllt ist, laden wir ihn und setzen die Schreibefunktion wieder in den<br />
Idle Modus.<br />
Abbildung 6.5.: EEPROM auslesen<br />
Project Report 25
6. Firmware<br />
6.6. FPGA Autokonfiguration<br />
Ist der <strong>Gecko3</strong> im stand-alone Modus, muss der FPGA automatisch von der Firmware beschrieben<br />
werden. Seine Konfiguration ist dafür im SPI Flash abgelegt. Das automatische<br />
Konfigurieren ist im Unterkapitel 6.6.3 beschrieben.<br />
6.6.1. SPI Flash beschreiben<br />
Um eine Konfiguration im SPI Flash zu speichern, startet der Host mit dem entsprechenden<br />
Vendor Request diese Funktion. Danach kontrollieren wir ob Daten im EP2 FIFO Buffer<br />
vorhanden sind. Wenn dieser Fall zutrifft, wird die Anzahl Byte im FIFO Buffer eingelesen.<br />
Handelt es sich um eine neue Konfiguration werden die dazu benötigten Sektoren im SPI<br />
Flash gelöscht. Dies ist nötig um überhaupt in den Flash-Speicher schreiben zu können.<br />
Mit der Page Program Instruktion kann man dem SPI Flash maximal 256 Byte senden.<br />
Deshalb wird kontrolliert, ob der Inhalt im EP2 FIFO Buffer grösser als 256 Byte ist. Es<br />
können höchstens 512 Byte im FIFO Buffer vorhanden sein, also zwei mal eine Page Program<br />
Instruktion. Da jedoch die Start Page Program und Last Page Program Funktionen schon je<br />
ein Byte schreiben, muss die Page Programm Schleife zwei Byte weniger schreiben, weshalb<br />
ein Offset nötig ist. Die Schleife wird verlassen, wenn sie den Wert des FIFO Buffers minus<br />
den Offset erreicht hat. Sind also weniger als 256 Byte im FIFO Buffer vorhanden, ist der<br />
Offset zwei. Wenn es jedoch mehr sind, muss der Offset mit Berücksichtigung auf die Limite<br />
der 256 Byte berechnet werden. Wir starten nun die Page Program Instruktion, wiederholen<br />
diese bis die Schleifenbedingung erfüllt ist und beenden sie mit einem Last Page Program.<br />
Sind es mehr Daten als 256 Byte, wird vom EP2 Bytezähler 256 subtrahiert und der Offset<br />
auf 2 gesetzt, da sowieso höchstens noch einmal 256 Byte vorhanden sein können. Danach<br />
erhöht die Firmware entsprechend der gesendeter Datenmenge die SPI Flash Adresse und<br />
wiederholt die Sequenz, bis die Übertragung abgeschlossen ist. Bei Unklarheiten verweisen<br />
wir auf den gut kommentierten Sourcecode dieser Funktion, der im Anhang E.1.5 zu finden<br />
ist. Die Abbildung 6.6 stellt dabei den strukturellen Ablauf dar.<br />
26 Matthias Zurbrügg
6.6. FPGA Autokonfiguration<br />
Abbildung 6.6.: SPI Flash beschreiben<br />
Project Report 27
6. Firmware<br />
6.6.2. SPI Flash auslesen<br />
Die Lesefunktion des SPI Flashs ist auf das wesentliche beschränkt. Mit ihr ist es möglich<br />
512 Byte aus dem SPI Flash auszulesen und über USB an den Host zu senden. Die Startadresse<br />
wird dabei auf 0 gesetzt. Mit dem entsprechenden Vendor Request ruft der Anwender<br />
die Funktion auf. Danach kontrolliert man zuerst, ob der EP4 FIFO Buffer voll ist. Wenn das<br />
nicht der Fall ist, wird eine Block Read Instruktion nach dem selben Prinzip wie beim Schreiben<br />
durchgeführt. Wie auch beim EEPROM ist die Anzahl Byte beim Lesevorgang nicht<br />
limitiert. Das heisst der FIFO Buffer kann ohne Unterbruch mit 512 Byte gefüllt werden.<br />
Die Abbildung 6.7 zeigt den Ablauf der Funktion.<br />
Abbildung 6.7.: SPI Flash auslesen<br />
6.6.3. FPGA Bootload<br />
Die Bootload Funktion wird in der Initialisierung der Firmware aufgerufen. Das heisst der<br />
EZ-USB FX2 beschreibt den FPGA bei jedem Neustart, egal ob eine Konfiguration im SPI<br />
Flash vorhanden ist oder nicht. Ist das SPI Flash leer, wird der Spartatn 3 keine gültige<br />
Konfiguration erhalten, was jedoch kein Problem ist, da er vor jedem Konfigurieren seinen<br />
Inhalt verwirft. Der Programmablauf in dieser Funktion ist praktisch derselbe wie bei der<br />
direkten Konfiguration vom Host. Der einzige Unterschied liegt darin, dass die Daten nicht<br />
vom EP2 FIFO Buffer an den Port gelegt werden, sondern von der Block Read Funktion.<br />
Wir verweisen daher auf das Unterkapitel 6.4 und den Sourcecode.<br />
28 Matthias Zurbrügg
6.7. Kommunikation zwischen Host und FPGA<br />
6.7. Kommunikation zwischen Host und FPGA<br />
Für die Kommunikation zwischen Host und FPGA werden, wie in Unterkaptiel 6.2 beschrieben,<br />
die Endpoints 6 und Endpoint 8 benutzt. Für höhere Datenraten ist der 8051 Mikrokontroller<br />
jedoch viel zu langsam. Cypress hat dafür ein General Propose Interface (GPIF)<br />
in den EZ-USB FX2 integriert, der die Arbeit für schnelle Verbindungen übernehmen soll.<br />
Die Abbildung 6.8 zeigt ein Blockdiagramm der Peripherie.<br />
Abbildung 6.8.: GPIF<br />
Das GPIF ist direkt mit dem USB verbunden und kann unabhängig vom Mikrokontroller<br />
Daten bidirektional zwischen USB Endpoint und externer Peripherie austauschen. Der<br />
Mikrokontroller übernimmt dabei nur die Konfiguration des GPIFs und minimale Steuerfunktionen.<br />
Das General Propose Interface ist eine Statemachine, die mit dem GPIF Designer von<br />
Cypress mit sogenannten Waveforms programmiert wird. Man kann im ganzen vier Waveforms<br />
definieren, die jeweils bis zu sieben States haben. Das GPIF kennt vier verschieden<br />
Übertragungsarten<br />
• Single-Write Transaction um Steuerbefehle an die externe Peripherie zu übermitteln<br />
• Single-Read Transaction um Steuerbefehle von der externen Peripherie zu erhalten<br />
• FIFO-Write und FIFO-Read Transaction um grosse Datenmengen mit der externen<br />
Peripherie auszutauschen<br />
Wir benötigen nur die FIFO Transactions, da mit unserem Handshaking die externe Peripherie<br />
keine Steuerbefehle benötigt. Die Waveforms müssen der Transaktionsart zugewiesen<br />
werden. In unserem Fall haben wir eine Waveform der FIFO-Read Transaction zugewiesen<br />
um Daten vom FPGA zum USB zu übermitteln. Für die andere Richtung haben wir<br />
eine Waveform als FIFO-Write Transaction definiert. Die zwei übrigen Waveforms werden<br />
nicht verwendet. Über den GPIF Designer kann man die Ein- und Ausgangessignale, die<br />
Waveforms und dessen Transaktionsarten definieren. Beim anschliessenden Export in eine<br />
C-Datei sind keine weiteren Änderungen am erzeugten Programmcode nötig. Es erstellte<br />
Datei (Gpif.c) muss lediglich in das µVision2 Projekt eingebunden und die darin enthaltene<br />
Initialisierung aufgerufen werden. Hinweise zur Verwendung des GPIF Designers sind im<br />
Anhang D zu finden.<br />
Project Report 29
6. Firmware<br />
6.7.1. Read Waveform<br />
Bevor die Firmware die Read Waveform aufruft, kontrollieren wir ob sich das GPIF im<br />
Idle Status befindet. Das interne FIFO Flag im GPIF wird dann so eingestellt, dass es<br />
der EP6 FIFO Buffer setzt wenn er voll ist. Erst jetzt wird die Read Waveform gestartet.<br />
Solange die Firmware kein Timeout auslöst, warten wir auf das Done Bit vom GPIF. Das<br />
Interface setzt dieses Bit falls es von einer Waveform in den Idle Status zurückkehrt. Verweilt<br />
die Statemachine zulange im selben Status wird der Timeout ausgelöst und die Waveform<br />
abgebrochen. Somit erzwingt man ein Setzen des Done Bits. Dies geschieht regelmässig, da<br />
die Read Waveform periodisch aufgerufen wird, um zu kontrollieren ob der FPGA Daten<br />
senden will. Sendet er nichts bleibt die Waveform solange im S0 Status bis das Timeout sie<br />
abbricht. Das General Propose Interface übernimmt das gesammte USB Handling. Erst am<br />
Ende der Übertragung muss der Endpoint, falls der FIFO Buffer nicht gefüllt ist, von der<br />
Firmware geladen werden. In der Abbildung 6.9 ist die GPIF Read Funktion der Firmware<br />
dargestellt.<br />
Abbildung 6.9.: GPIF Read Funktion der Firmware<br />
Im Ruhezustand kontrolliert das GPIF in der Read Waveform ob das WRX gesetzt wurde.<br />
Wenn das nicht der Fall ist, bricht die Firmware die Waveform wieder ab. Will der FPGA<br />
jedoch etwas senden, so prüfen wir zuerst, ob der EP8 FIFO Buffer nicht voll ist. Danach<br />
30 Matthias Zurbrügg
6.7. Kommunikation zwischen Host und FPGA<br />
wird das RDYU gesetzt und auf das Löschen des WRX gewartet. Wenn dieser Fall eintrifft,<br />
liest das GPIF die Daten vom Bus und löscht sein RDYU. Der folgende Decision Point<br />
entscheidet, ob der FPGA weiter Daten sendet oder die Kommunikation beendet wird. In<br />
Abbildung 6.10 sieht man die in der Read Waveform definierte Statemachine.<br />
Abbildung 6.10.: Read Waveform (FPGA to GPIF)<br />
6.7.2. Write Waveform<br />
Falls der EP6 Daten empfängt, startet die Firmware die Write Waveform. Diese wird als<br />
erstes kontrollieren, ob der Bus frei ist, bzw. der FPGA nichts senden will. Ist der Bus frei,<br />
wird das WRU gesetzt und auf das RDYX gewartet. Kommt das Ready vom FPGA, legt<br />
das GPIF die Daten an den Bus und löscht WRU wieder. Falls immer noch Daten im EP6<br />
FIFO Buffer vorhanden sein sollten, springen wir wieder in den S0 Status und warten auf<br />
das stornieren des RDYX. Ist die Übertragung abgeschlossen, wird ebenfalls auf das Löschen<br />
von RDYX gewartet und anschliessend das Ende des Datentransfers mit der Regelverletzung<br />
mitgeteilt. Die Abbildung 6.11 zeigt die etwas kleinere Statemachine der Write Waveform.<br />
Project Report 31
6. Firmware<br />
Abbildung 6.11.: Write Waveform (GPIF to FPGA)<br />
32 Matthias Zurbrügg
6.7. Kommunikation zwischen Host und FPGA<br />
Die Write Funktion der Firmware unterscheidet sich, wie man in der Abbildung 6.12 erkennen<br />
kann, nur im Endpoint von der Read Funktion und wird daher nicht weiter erläutert.<br />
Abbildung 6.12.: GPIF Write Funktion der Firmware<br />
Project Report 33
6. Firmware<br />
6.7.3. Datenrate<br />
Wie schon im Unterkapitel 3.1 angetönt, läuft die Kommunikation mit 8 Bit Busbreite. Vom<br />
GPIF wäre eine Busbreite von 16 Bit möglich. Bei der Implementation der Firmware auf dem<br />
<strong>Gecko3</strong> kann dies jedoch schnell im Register EPxFIFOCFG oder mit dem GPIF Designer<br />
(Wordwide Modus) umgestellt werden [Cyp06]. Um die Datenrate ungefähr voraussagen zu<br />
können, habe wir Messungen mit dem Logic Analyser gemacht. Die Abbildung 6.13 zeigt<br />
den Downstream (Host zu FPGA) von 512 Byte. Mit den Markern lesen wir eine Zeit von<br />
90.24 µs für diese Datenlänge mit der Abbruchbedingung heraus.<br />
Abbildung 6.13.: Downstream von 512 Byte<br />
Die folgende Berechnung der Datenrate geht von einem 16 Bit breiten Bus aus.<br />
Anzahl übertragene Bit: 512 Byte · 8 Bit /Byte · 2 = 8192 Bit (6.1)<br />
Datenrate:<br />
8192 Bit<br />
90.24 µs = 90.78 MBit /s (6.2)<br />
34 Matthias Zurbrügg
6.7. Kommunikation zwischen Host und FPGA<br />
Da wir beim Upstream eine etwas längere Statemachine haben, ist die Datenrate niedriger.<br />
Die Abbildung 6.14 zeigt den Upstream (FPGA zu Host) von ebenfalls 512 Byte. Um diese<br />
Datenmenge zu senden, werden 146.9 µs benötigt.<br />
Abbildung 6.14.: Upstream von 512 Byte<br />
Die folgende Berechnung der Datenrate geht ebenfalls von einem 16 Bit breiten Bus aus.<br />
Anzahl übertragene Bit: 512 Byte · 8 Bit /Byte · 2 = 8192 Bit (6.3)<br />
Datenrate:<br />
8192 Bit<br />
146.9 µs = 55.77 MBit /s (6.4)<br />
Project Report 35
6. Firmware<br />
6.8. Vendor Requests<br />
Der Host verwendet Vendor Requests um der Firmware mitzuteilen, welche Funktion er<br />
ausführen will. Diese werden, wie schon in der Abbildung 4.1 dargestellt, über den Endpoint<br />
0 gesendet. Der Endpoint 0 ist besitzt einen bidirektionalen 64 Byte grossen Buffer. Wir<br />
haben folgende Vendor Requests definiert:<br />
• C1: Host sendet eine FPGA Konfiguration<br />
• C2: EEPROM mit einer Firmware beschreiben<br />
• C3: wählbare Anzahl Byte vom EEPROM lesen (zum Debuggen)<br />
• C4: SPI Flash mit einer Konfiguration beschreiben<br />
• C5: 512 Byte aus dem SPI Flash lesen (zum Debuggen)<br />
• C6: Bestätigung vom Host, dass Daten komplett gesendet wurden<br />
• B1: Verlangt die Rückgabe der Firmware Version<br />
• B2: Verlangt die Rückgabe des Done Bits nach einer Konfiguration<br />
Wie der Ablauf von Vendor Requests und die anschliessende Datenübertragung aussieht,<br />
zeigt das Kaptiel 7.<br />
36 Matthias Zurbrügg
7. Hostsoftware<br />
Der aus Sicht des Anwenders wichtigste Teil unserer Arbeit ist die Host PC Software, da<br />
er mit ihr das Gecko Board in Betrieb nehmen kann und sie ihm einen möglichst einfachen<br />
Weg bereitstellt mit dem Gecko Board Daten auszutauschen.<br />
Für den Anwender gibt es die folgenden Aufgaben, die unsere Hostsoftware erfüllen muss:<br />
• Direkte Konfiguration des FPGAs<br />
• Download einer FPGA Konfigurationsdatei für den stand-alone Betrieb<br />
• Möglichkeit um mit dem FPGA Daten auszutauschen<br />
Der Datenaustausch wird von den anderen Aufgaben getrennt betrachtet. Dies ist sinnvoll,<br />
weil der Datenaustausch in den meisten Fällen auf die Applikation abgestimmt ist und die<br />
Daten vielfach zuerst weiterverarbeitet werden sollen.<br />
Dies haben wir schon im Konzept der USB Kommunikation einfliessen lassen und die<br />
beiden unterschiedlichen Fälle Administration und Kommunikation logisch voneinander getrennt.<br />
Wie im Kapitel 6 und in der Abbildung 6.1 beschrieben wird, sind für diese Fälle<br />
getrennte Interfaces vorhanden. Aus Sicht des Host verhält sich ein USB Gerät mit mehreren<br />
Interfaces wie einzelne getrennte Geräte. So ist es in unserem Fall möglich, für die<br />
Kommunikation und die Administration separate Software einzusetzen, ohne dass sich diese<br />
gegenseitig blockieren.<br />
Für die Hostsoftware weitere wichtige Anforderungen:<br />
• Plattformübergreiffend einsetzbar, mindestens unter Linux und Windows<br />
• Möglichst einfach in der Benutzung<br />
• Kommunikation mit dem FPGA möglichst transparent<br />
• Anwender soll sich nicht um die USB Schnittstelle kümmern müssen<br />
• Beispielprogramme sollen dem Anwender den Einstieg vereinfachen<br />
• Aktualisieren der Firmware des EZ-USB FX2 mit der Hostsoftware möglich<br />
7.1. Planung<br />
Um diese Anforderungen unter einen Hut zu bringen war etwas mehr Planung nötig um<br />
zu entscheiden welche Entwicklungswerkzeuge, Programmiersprache und Bibliotheken genutzt<br />
werden sollen. Da es sich um eine plattformübergreiffende Entwicklung mit graphischer<br />
Oberfläche handelt, musste zuerst ein GUI Framework gesucht werden, dass auf mehreren<br />
Plattformen verfügbar ist. Dabei fiel die Wahl schnell auf Qt von der Firma Trolltech<br />
Project Report 37
7. Hostsoftware<br />
(www.trolltech.com), da dieses auf Windows, Linux und MacOS X verfügbar ist, sehr ausgereift<br />
ist und wir von der Erfahrung von Andreas Eicher, Assistent im Microlab, profitieren<br />
konnten. Qt ist ein Framework für C++, so stand auch die Programmiersprache fest. Java<br />
war keine Option, weil die USB Schnittstelle nicht unterstützt wird.<br />
Qt wird von Trolltech unter verschiedenen Lizenzen angeboten. Eine Variante ist die GNU<br />
Public License (GPL), die einen Entwickler dazu zwingt ein Projekt, das GPL Software benutzt,<br />
auch unter die GPL zu stellen und mit allen Sourcecodes zu veröffentlichen. Qt wird<br />
nur in der Version 4 und höher auch auf Windows unter der GPL angeboten. Die andere<br />
Variante ist eine kommerzielle Lizenz, die von Trolltech erworben werden kann. Damit muss<br />
der Sourcecode eines Projektes nicht veröffentlicht werden. Zur Zeit wird von uns Qt 4.1.2 in<br />
der GPL Version benutzt aber die Frage der Veröffentlichung unserer Software konnte noch<br />
nicht geklärt werden.<br />
Um zu verhindern, dass unter Linux ein eigenes Kernelmodul entwickelt werden muss,<br />
greiffen wir auf die libusb zurück (libusb.sourceforge.net, Version 0.1.12), ein Open-Source<br />
Projekt unter der LGPL. Die LGPL erlaubt eine uneingeschränkte Verwendung in eigenen<br />
Projekten aber Änderungen an der libusb müssen veröffentlicht werden. Mit der libusb kann<br />
direkt aus einem Anwenderprogramm auf USB Geräte zugegriffen werden. Folgende Plattformen<br />
werden unterstützt: Linux, *BSD und MacOS X<br />
Für Windows existiert ein anderes Projekt (libusb-win32.sourceforge.net), das die libusb<br />
portiert hat und die selbe API besitzt. So ist es theoretisch möglich, unsere Hostsoftware<br />
auf Windows, Linux und MacOS X einzusetzen. Die Software wurde unter Linux entwickelt<br />
und getestet. Leider reichte die Zeit nicht aus, die Portierbarkeit unserer Software und der<br />
libusb zu testen.<br />
Unter Windows steht als Option weiterhin die Entwicklung eines eigenen Treibers zur Verfügung,<br />
da von Cypress dazu Beispiele vorhanden sind. Dies erleichtert den Einstieg in die<br />
Treiberprogrammierung enorm.<br />
7.2. Realisierung<br />
Da keiner von uns Erfahrung in der C++ Programmierung hatte, mussten wir in kurzer Zeit<br />
einen Überblick bekommen. Dabei war uns Andreas Eicher und das Buch [Bre03] behilflich.<br />
Die Hostsoftware wurde in mehrere Klassen und mehrere Applikationen unterteilt. Das<br />
zentrale Element ist die QGecko Klasse. Sie ist von der Klasse QObject, der Grundklasse<br />
des Qt Frameworks, abgeleitet. Sie stellt alle Funktionen bereit, die zur Administration und<br />
Kommunikation mit dem Gecko Board benötigt werden. Die USB Zugriffe sind vollständig<br />
gekapselt.<br />
Aufbauend auf dieser Klasse wurden zwei Applikationen erstellt: Der Gecko Administrator<br />
und das Simplecom. Der Gecko Administrator stellt ein graphisches Interface für alle<br />
administrativen Aufgaben des Gecko Boards zur Verfügung. Das Simplecom diente uns zum<br />
testen der Kommunikation mit dem FPGA und zeigt, wie einfach eine Applikation mit dem<br />
FPGA Daten austauschen kann. Der Sourcecode vom Simplecom dient als Beispiel zur Verwendung<br />
der QGecko Klasse zur Kommunikation mit dem Gecko Board. Die Sourcecodes<br />
sind im Anhang E.3 zu finden.<br />
Die implementierten Funktionen der Hostsoftware wurden getestet und funktionierten.<br />
Ein kurzer Blindtest, von Personen die die Software noch nicht kannten, hat ergeben, dass<br />
sie keine Fehlfunktion auslösen konnten. Limitierend ist zur Zeit einzig, dass unter Linux<br />
38 Christoph Zimmermann
7.3. Gecko Library<br />
bisher Root Rechte nötig sind. Es existieren unter Linux mehrere Möglichkeiten um die<br />
Zugriffsrechte von USB Geräten zu beeinflussen. Die derzeit aktuelle und flexibelste Lösung<br />
in diesem Zusammenhang ist der udev Dämon, der alle zur Laufzeit hinzugefügten bzw.<br />
entfernten Geräte verwaltet. Einer der nächsten Schritte in der Entwicklung der Hostsoftware<br />
unter Linux sollte es sein, udev so zu konfigurieren, dass alle Studenten auf den Gecko<br />
zugreiffen können.<br />
7.3. Gecko Library<br />
In diesem Unterkapitel werden die von der Gecko Library zur Verfügung gestellten Funktionen<br />
beschrieben und erklärt wie sie das Gecko Board ansteuern. Die Namen der Funktionen<br />
sind so gewählt, dass man sofort sieht ob sie zur Kommunikation oder Administration (beginnen<br />
immer mit adm) dienen. Alle Funktionen liefern als Rückgabewert einen Binärwert<br />
zurück der aussagt, ob die Funktion erfolgreich war oder nicht.<br />
• bool open()<br />
Diese Funktion öffnet eine Kommunikationsverbindung zum Gecko Board.<br />
Sie entspricht mehrheitlich dem Beispiel in der libusb Dokumentation zum Suchen und<br />
Öffnen eines USB Gerätes. Als erstes werden alle USB Busse und dann alle Geräte neu<br />
eingelesen. Danach wird mit den so erhaltenen Informationen nach der Vendor und<br />
Product ID des Gecko Boards gesucht. Bei Erfolg wird ein allfälliger Linux Kernel<br />
Treiber entfernt und das Interface zur Kommunikation geöffnet. Die Funktion bricht<br />
nach dem ersten Fund ab, es ist mit dieser Funktion nicht möglich mehrere Gecko<br />
Boards am gleichen Rechner parallel zu betreiben.<br />
• bool close()<br />
Schliesst eine geöffnete Kommunikationsverbindung mit dem Gecko Board, wenn eine<br />
solche existiert.<br />
• bool read(QByteArray *readData, int byteCount)<br />
Funktion um die im Parameter byteCount angegebene Anzahl Bytes vom Gecko Board<br />
zu lesen und setzt diese Daten ans Ende des zur Verfügung gestellten QByteArrays.<br />
Das ByteArray muss existieren.<br />
Die Funktion führt einen einfachen Bulkread auf dem Kommunikationsinterface aus.<br />
• bool write(QByteArray data)<br />
Funktion um die Daten in einem QByteArray an das Gecko Board zu senden.<br />
Die Funktion führt einen einfachen Bulkwrite auf dem Kommunikationsinterface aus.<br />
• bool write(QFile &data)<br />
Funktion um den Inhalt eines ganzen Files an das Gecko Board zu übertragen. Das<br />
File muss existieren und geöffnet sein. Am Ende der Funktion zeigt der Filepointer auf<br />
das Ende des Files.<br />
Da die Bulkwrite Funktion der libusb nur einen Integerwert für die Anzahl Bytes<br />
benutzt, muss die Übertragung eines ganzen Files in mehrere Transaktionen aufgeteilt<br />
werden.<br />
• bool admOpen()<br />
Funktion zum Öffnen einer Administrationsverbindung zum Gecko Board.<br />
Project Report 39
7. Hostsoftware<br />
Funktioniert genau so wie die open() Funktion mit dem Unterschied, dass das Administrationsinterface<br />
geöffnet wird.<br />
• bool admClose()<br />
Schliesst eine geöffnete Administrationsverbindung mit dem Gecko Board, falls eine<br />
existiert.<br />
• bool admConfigure(QFile &configData)<br />
Funktion um den FPGA auf dem Gecko Board zu konfigurieren. Das File muss eine<br />
korrekte Konfigurationsdatei ohne Header Informationen sein. Das File muss existieren<br />
und geöffnet sein.<br />
Um den FPGA zu konfigurieren muss zuerst der entsprechende Vendor Request gesendet<br />
werden (siehe dazu Unterkapitel 6.8) und im Anschluss die Konfigurationsdaten.<br />
Nach dem alle Daten der Konfigurationsdatei gesendet sind, muss ein Vendorrequest<br />
gesendet werden, der den Abschluss bestätigt.<br />
• bool admDownload(QFile &configData, int place)<br />
Funktion zum Download von FPGA Konfigurationsdateien für den stand-alone Betrieb<br />
des Gecko Boards. Das File muss eine korrekte Konfigurationsdatei ohne Header<br />
Informationen sein. Das File muss existieren und geöffnet sein. Der Parameter place<br />
gibt an, welcher Konfigurationsplatz beschrieben werden soll. Auf dem Gecko Board<br />
können mehrere Konfigurationen parallel gespeichert werden und per Schalter ausgewählt<br />
werden, welche geladen werden soll. Die Konstante GECKO MAX CONFIGS<br />
die in dieser Library definiert ist, gibt an wie viele Plätze zur Verfügung stehen.<br />
Der Ablauf ist der selbe wie bei der Konfiguration des FPGA, es werden nur andere<br />
Vendor Requests gesendet.<br />
• bool admFirmware(QFile &configData)<br />
Funktion um eine neue Firmware für den EZ-USB FX2 auf das Gecko Board zu laden.<br />
Die Firmware wird in das EEPROM geschrieben und wird nach einem Reset des EZ-<br />
USB FX2 gestartet. Das File muss ein korrektes Firmware File im Format *.iic sein<br />
(siehe dazu Unterkapitel 6.5). Wie bei den anderen Funktionen muss das File existieren<br />
und geöffnet sein.<br />
Die Funktion sendet den Vendor Request zum Senden einer Firmware, danach werden<br />
die Daten aus dem Firmware File gesendet und am Schluss der Vendor Request zur<br />
Bestätigung, dass alle Daten gesendet wurden.<br />
• bool admGetFwVersion(QString *version)<br />
Funktion zum Abfragen der Versionsnummer der EZ-USB FX2 Firmware. Der QString<br />
muss existieren. Die Versionsnummer ist im Format X.XX und wird dem String angehängt.<br />
Die Versionsnummer wird gelesen indem ein Vendor Request gesendet wird, der den<br />
EZ-USB FX2 auffordert vier Bytes zurück zu senden. Dazu wird der Vendor Request<br />
mit der Bitmaske verknüpft die das Bit für eine Lesetransaktion setzt.<br />
Diese Funktionsbibliothek sollte später als dynamische Library kompiliert werden und<br />
systemweit verfügbar gemacht werden.<br />
40 Christoph Zimmermann
7.4. Gecko Administrator<br />
7.4. Gecko Administrator<br />
Der Gecko Administrator (Dateiname ist geckoadm) stellt eine graphische Benutzeroberfläche<br />
zur Benutzung des Gecko Boards zur Verfügung. Das GUI ist schlicht gehalten. Die<br />
einzelnen Funktionen werden in separaten Tabbs angeordnet um die Übersichtlichkeit zu<br />
erhöhen. Wenn die Applikation normal gestartet wird, stehen folgende Funktionen zur Auswahl:<br />
• FPGA Konfiguration (Abbildung 7.1)<br />
• Download Konfiguration (Abbildung 7.2)<br />
• Informationsseite mit der Versionsnummer, Autoren etc. (Abbildung 7.4)<br />
Abbildung 7.1.: GUI zur FPGA Konfiguration<br />
Abbildung 7.2.: GUI zum Download der<br />
Konfigurationsdatei<br />
Abbildung 7.3.: GUI zum Aktualisieren der<br />
Firmware<br />
Abbildung 7.4.: Informationsseite des Gecko<br />
Administrators<br />
Wenn die Applikation mit der Kommandozeilenoption “−−firmware” gestartet wird, kann<br />
auch die EZ-USB FX2 Firmware aktualisiert werden und die Version abgefragt werden (Abbildung<br />
7.3). Diese Funktion wird normalerweise nicht angezeigt um zu verhindern, dass ein<br />
Project Report 41
7. Hostsoftware<br />
Benutzer versehentlich eine Aktualisierung macht mit einer falschen Firmware und so das<br />
Gecko Board nicht mehr mit unserer Hostsoftware benutzt werden kann. Nach solch einem<br />
Missgeschick kann eine korrekte Firmware unter Windows mit dem Cypress EZ-USB Control<br />
Panel oder unter Linux mit dem Programm fxload heruntergeladen werden.<br />
Die typischen Fehler des Benutzers werden vom Gecko Administrator abgefangen. Entweder<br />
es wird ein Hinweisfenster angezeigt oder eine Meldung in die Statuszeile geschrieben.<br />
Wenn eine Funktion nicht ordnungsgemäss ausgeführt werden konnte, wird dies ebenfalls in<br />
der Statusleiste angezeigt. Die vom Benutzer zuletzt verwendeten Dateien und Pfade werden<br />
beim Beenden gespeichert und der Anwender kann beim nächsten Start der Applikation<br />
gleich weiterarbeiten. Die USB Kommunikation wird vor jedem Funktionsaufruf neu geöffnet<br />
und am Ende wieder geschlossen. Die Applikation muss also nicht geschlossen werden, wenn<br />
das Gecko Board vom Host PC getrennt wird.<br />
7.5. Beispielprogramm: Simplecom<br />
Diese Applikation zeigt die Verwendung der Gecko Library um eigene Software zu programmieren,<br />
die mit dem Gecko Board Daten austauscht.<br />
Im Konstruktor wird das GUI erstellt und die Kommunikation mit dem Gecko Board<br />
initialisiert. Dazu muss eine Instanz der QGecko Klasse erstellt werden, danach kann mit<br />
der Funktion open() die USB Kommunikation geöffnet werden.<br />
Der Rest zeigt, wie einfach Dateien gesendet und Daten gelesen werden können. Im GUI<br />
werden die Daten als hexadezimale Zahlen dargestellt.<br />
Das Simplecom ist kein vollständiges Programm, da einige Sicherheitsabfragen und Elemente<br />
der Fehlerbehandlung fehlen. Es erfüllt aber den Zweck als Beispiel für eigene Projekte.<br />
42 Christoph Zimmermann
8. Ausblick<br />
Dieses Kapitel soll den weiteren Projektverlauf aufzeigen.<br />
8.1. Weiteres Vorgehen<br />
8.1.1. Firmware<br />
• Planung und Realisation eines Protokolls, das im Kommunikationsmodus die Datenlänge<br />
die der FPGA senden will, dem Host mitteilt.<br />
• GPIF auf 16 Bit Busbreite konfigurieren<br />
• Schalter über I 2 C einlesen, der bestimmt von welchem Teil des SPI Flashs die Konfiguration<br />
geladen wird<br />
• Status der Firmware über I 2 C an LEDs ausgeben<br />
• Das nichtsetzen des FIFO Buffer Full Flags analysieren<br />
• Wenn nötig EEPROM und SPI Flash Lesefunktionen ausbauen<br />
• FPGA Typ von Firmware auslesen, damit die Grösse der Konfigurationsdatei nicht<br />
mehr manuell im C-Code definiert werden muss<br />
8.1.2. Hostsoftware<br />
• Windows Portierung<br />
• Test mit USB 1.1, da während unserer Arbeit kein USB 1.1 Hub zur Verfügung stand<br />
• Test auf 64 Bit Computern und Betriebssystemen<br />
• Flash und EEPROM auslese Funktionen<br />
• Entwicklung einer Applikation um das Intel NOR Flash zu beschreiben<br />
8.1.3. FPGA Cores<br />
• Ansteuerung des Intel NOR Flashs<br />
• Bei Bedarf verbesserung der Testroutinen<br />
• Entwicklung eines einfachen Referenzsystems<br />
• Schreiben von Testroutinen für die weiteren Funktionsblöcke<br />
Project Report 43
8. Ausblick<br />
8.1.4. <strong>Gecko3</strong> Hardware<br />
• Validierung des Schemas<br />
• Layouten der Leiterplatte<br />
• Post-route Simulation der DDR-RAM Verbindungen<br />
• Aufbau, Test und Messungen des Prototyps<br />
• Planung der Produktion einer Kleinserie<br />
44 Matthias Zurbrügg, Christoph Zimmermann
9. Schlusskapitel<br />
Die <strong>Gecko3</strong> Softwareentwicklung war ein sehr abwechslungsreiches Projekt, das uns den<br />
Einblick auf das Zusammenwirken verschiedener Programmiersprachen auf verschiedenen<br />
Plattformen und die Verwendung mehrerer Bussysteme gewährte.<br />
Cypress ist uns dabei in etwas schlechter Erinnerung geblieben. Ihr falsch verdrahtetes<br />
D-Sub Kabel oder die Beispiele, die nur mit einer älteren Version des Control Panels funktionieren,<br />
haben wesentlich zu ihrem getrübten Ruf bei uns beigetragen.<br />
Doch Dank unserem guten Teamgeists konnten etliche Fragen beantwortet und die Probleme<br />
gelöst werden. Somit war es möglich das Projekt erfolgreich abzuschliessen.<br />
18. Dezember 2006, Biel/Bienne<br />
Matthias Zurbrügg<br />
Christoph Zimmermann<br />
.......................................... ..........................................<br />
Project Report 45
Anhang<br />
46 Matthias Zurbrügg, Christoph Zimmermann
A. Projekt- und Zeitplanung<br />
Project Report 47
A. Projekt- und Zeitplanung<br />
Abbildung A.1.: Abhänigkeiten der Projektziele<br />
48 Matthias Zurbrügg, Christoph Zimmermann
A. Projekt- und Zeitplanung<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Abbildung A.2.: Soll Zeitplan<br />
Project Report 49
A. Projekt- und Zeitplanung<br />
Projektplanung<br />
Einrichtung<br />
Entwicklungsumgebung<br />
Entwicklungshardware<br />
SPI einarbeiten<br />
SPI R/W (von EZ-<br />
USB)<br />
GPIF einarbeiten<br />
USB komm.<br />
(Testdaten)<br />
FPGA Konfig.<br />
FPGA Komm.<br />
Dateistruktur in SPI<br />
Flash<br />
I2C EEPROM<br />
ansteuern<br />
FPGA Komm.<br />
Loopback<br />
NOR writer core<br />
USB Linux<br />
einarbeiten<br />
USB Windows<br />
einarbeiten<br />
Gecko 3 USB<br />
Protokoll<br />
EZ-USB Firmware<br />
Planung Host SW<br />
Hostsoftware<br />
Overall Testing<br />
Dokumentation<br />
Administration<br />
Schemakorrekturen<br />
Layoutbetreuung<br />
Absenzen<br />
Ch. Zimmermann<br />
M. Zurbrügg<br />
Oktober November<br />
Dezember<br />
23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18<br />
Abbildung A.3.: Ist Zeitplan<br />
50 Matthias Zurbrügg, Christoph Zimmermann
B. Definition der Verbindung des<br />
Spartan3 Boards mit dem EZ-USB<br />
FX2 Board<br />
Project Report 51
B. Definition der Verbindung des Spartan3 Boards mit dem EZ-USB FX2 Board<br />
Pin on EZ-USB FX2 Pin on EZ-USB Dev-kit Name in Schematic Direction Case: Configuration of FPGA Case: SoC - Host Pin on Spartan3 FT256 Pin on Connector B1<br />
FD0 P1.19 D0 I/O D7 Data 0 M6 19<br />
FD1 P1.18 D1 I/O D6 Data 1 N6 17<br />
FD2 P1.17 D2 I/O D5 Data 2 R7 15<br />
FD3 P1.16 D3 I/O D4 Data 3 T7 13<br />
FD4 P1.15 D4 I/O D3 Data 4 R10 11<br />
FD5 P1.14 D5 I/O D2 Data 5 P10 9<br />
FD6 P1.13 D6 I/O D1 Data 6 N11 7<br />
FD7 P1.12 D7 I/O D0 Data 7 M11 40<br />
FD8 P1.11 D8 I/O unused Data 8 C15 21<br />
FD9 P1.10 D9 I/O unused Data 9 D15 23<br />
FD10 P1.9 D10 I/O unused Data 10 E15 25<br />
FD11 P1.8 D11 I/O unused Data 11 F15 27<br />
FD12 P1.7 D12 I/O unused Data 12 G16 29<br />
FD13 P1.6 D13 I/O unused Data 13 H16 31<br />
FD14 P1.5 D14 I/O unused Data 14 K16 33<br />
FD15 P1.4 D15 I/O unused Data 15 L15 35<br />
PA7 P2.12 DONE to EZ-USB Done locked* R14 37<br />
RDY0 & PA4 P2.5 & P2.15 INIT B/WRX to EZ-USB INIT B WRX N9 38<br />
PA5 P2.14 PROG B to FPGA Prog B locked* B3 36<br />
CTL1 P2.10 RDWR B/WRU to FPGA RDWR B WRU T3 5<br />
CTL2 P2.9 CS B/RDYU to FPGA CS B RDYU R3 20<br />
RDY1 P2.4 BUSY/RDYX to EZ-USB Busy RDYX P9 A1.20<br />
CTL0 P2.11 CCLK to FPGA CCLK locked* T15 39<br />
PKTEND P2.13 PKTEND to EZ-USB unused PKTEND C10 4<br />
*don’t touch Done/Program lines - would delete Configuration!!<br />
9.11.2006, zimmc5<br />
Tabelle B.1.: Definition der Verbindung zwischen dem Spartan 3 Starter Kit und dem EZ-USB FX2LP Development Kit<br />
52 Christoph Zimmermann
C. Hex to Bix<br />
Damit der EZ-USB FX2 die Firmware auf dem EEPROM als bootfähig erkennt, muss sie, wie<br />
schon im Unterkapitel 6.5 erwähnt, ein spezielles Format haben. Im vorbereiteten µVision2<br />
Projekt von Cypress ist der Kompiler schon so konfiguriert, dass er bei jeder Kompilation<br />
noch eine Software startet, die die Hex-Datei ins Binary-Format umwandelt, Kopf- und<br />
Fusszeile hinzufügt und als iic-Datei abspeichert.<br />
Die Abbildung C.1 zeigt wo diese Software im µVision2 unter Options for Target eingebunden<br />
werden kann.<br />
Abbildung C.1.: Starten einer zusätzlichen Software nach der Kompilation<br />
Neben dem Programmaufruf werden noch etliche Parameter mitgegeben. Unsere Parameterliste<br />
sieht folgendermassen aus:<br />
-i -r -m 0x16000 -v 0x04B4 -p 0x8613 -c 0x41 -f 0xC2 -o fpga cfg.iic fpga cfg.hex<br />
Die Parameterliste ist nach dem folgendem System aufgebaut:<br />
HEX2BIX [-AIBRH?] [-S symbol] [-M memsize] [-C Config0Byte] [-F firstByte] [-O filename]<br />
[Source]<br />
Dabei bedeuten die einzelnen Elemente:<br />
• Source - Input filename<br />
• A - Output file in the A51 file format<br />
Project Report 53
C. Hex to Bix<br />
• B - Output file in the BIX file format (Default)<br />
• BI - Input file in the BIX file format (hex is default)<br />
• C - Config0 BYTE for AN2200 and FX2 (Default = 0x04));<br />
• F - First byte (0xB0, 0xB2, 0xB6, 0xC0, 0xC2) (Default = 0xB2)<br />
• H, ? - Display this help screen<br />
• I - Output file in the IIC file format<br />
• M - Maximum memory size, also used as BIX out file size. (Default = 8k)<br />
• O - Output filename<br />
• P - Product ID (Default = 2131)<br />
• R - Append bootload block to release reset<br />
• S - Public symbol name for linking<br />
• V - Vendor ID (Default = 0x0547)<br />
54 Matthias Zurbrügg
D. GPIF Designer<br />
Grundsätzlich verweisen wir auf die Hilfe Datei im GPIF Designer und die dokumentierten<br />
Beispiele [Cyp03]. Die Beschreibung des Tools weist jedoch einige Lücken auf, welche mit<br />
diesem Anhang geschlossen werden.<br />
Abbildung D.1.: Block Diagram Register im GPIF Designer<br />
Im Block Diagram Register kann unter anderem, wie im Unterkapitel 6.7.3 erwähnt, die<br />
Busbreite auf 16 Bit erhöht werden. Die Nummerierung der RDY und CTL Leitungen ist aus<br />
dem GPIF Designer nicht klar ersichtlich. Die obersten Leitungen steht dabei für den nullten<br />
Pin des Ein -oder Ausgangs. Das heisst um den RDY0 als Eingang verwenden zu können,<br />
mussten wir die oberste Leitung verbinden. Die Abbildung D.1 zeigt das Bock Diagram<br />
Register von unserem GPIF Interface.<br />
Project Report 55
D. GPIF Designer<br />
Wie im Kapitel 6.7 beschrieben muss man für jede Waveform eine Übertragungsart auswählen.<br />
Die Abbildung D.2 zeigt graphisch wie diese Zuordnung gemacht wird.<br />
Abbildung D.2.: Waveform der Übertragungsart zuweisen<br />
56 Matthias Zurbrügg
E. Quellcode<br />
Project Report 57
E. Quellcode<br />
E.1. Firmware<br />
E.1.1. Cypress Firmware Framwork<br />
1 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
// F i l e : fw . c<br />
// Contents : Firmware frameworks t a s k d i s p a t c h e r and d e v i c e r e q u e s t p a r s e r<br />
// source .<br />
//<br />
6 // i n d e n t 3 . NO TABS!<br />
//<br />
// $Revision : 17 $<br />
// $Date : 11/15/01 5:45 p $<br />
//<br />
11 // Copyright ( c ) 2002 Cypress Semiconductor , Inc . A l l r i g h t s r e s e r v e d<br />
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
#include ” fx2 . h”<br />
#include ” f x 2 r e g s . h”<br />
16 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
// Constants<br />
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
#define DELAY COUNT 0 x9248 ∗8L // Delay f o r 8 sec at 24Mhz , 4 sec at 48<br />
#define IFREQ 48000 // IFCLK c o n s t a n t f o r S y n c h r o n i z a t i o n Delay<br />
21 #define CFREQ 48000 // CLKOUT c o n s t a n t f o r S y n c h r o n i z a t i o n Delay<br />
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
// Random Macros<br />
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
26 #define min ( a , b ) ( ( ( a ) (b ) ) ?( a ) : ( b ) )<br />
// R e g i s t e r s which r e q u i r e a s y n c h r o n i z a t i o n delay , see s e c t i o n 15.14<br />
// FIFORESET FIFOPINPOLAR<br />
31 // INPKTEND OUTPKTEND<br />
// EPxBCH: L REVCTL<br />
// GPIFTCB3 GPIFTCB2<br />
// GPIFTCB1 GPIFTCB0<br />
// EPxFIFOPFH: L EPxAUTOINLENH: L<br />
36 // EPxFIFOCFG EPxGPIFFLGSEL<br />
// PINFLAGSxx EPxFIFOIRQ<br />
// EPxFIFOIE GPIFIRQ<br />
// GPIFIE GPIFADRH: L<br />
// UDMACRCH: L EPxGPIFTRIG<br />
41 // GPIFTRIG<br />
// Note : The pre−REVE EPxGPIFTCH/L r e g i s t e r are a f f e c t e d , as w e l l . . .<br />
// . . . t h e s e have been r e p l a c e d by GPIFTC[ B3 : B0 ] r e g i s t e r s<br />
46 #include ” f x 2 s d l y . h” // Define IFREQ and CFREQ above t h i s #i n c l u d e<br />
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
// Global V a r i a b l e s<br />
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
51 v o l a t i l e BOOL GotSUD ;<br />
BOOL Rwuen ;<br />
BOOL S e l f p w r ;<br />
v o l a t i l e BOOL S l e e p ; // S l e e p mode e n a b l e f l a g<br />
56 WORD pDeviceDscr ; // Pointer to Device D e s c r i p t o r ; D e s c r i p t o r s may be moved<br />
WORD pDeviceQualDscr ;<br />
WORD pHighSpeedConfigDscr ;<br />
WORD pFullSpeedConfigDscr ;<br />
WORD pConfigDscr ;<br />
61 WORD pOtherConfigDscr ;<br />
58 Matthias Zurbrügg, Christoph Zimmermann
E.1. Firmware<br />
WORD pStringDscr ;<br />
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
// P r o t o t y p e s<br />
66 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
void SetupCommand ( void ) ;<br />
void TD Init ( void ) ;<br />
void TD Poll ( void ) ;<br />
BOOL TD Suspend ( void ) ;<br />
71 BOOL TD Resume ( void ) ;<br />
BOOL DR GetDescriptor ( void ) ;<br />
BOOL DR SetConfiguration ( void ) ;<br />
BOOL DR GetConfiguration ( void ) ;<br />
76 BOOL D R S e t I n t e r f a c e ( void ) ;<br />
BOOL DR GetInterface ( void ) ;<br />
BOOL DR GetStatus ( void ) ;<br />
BOOL DR ClearFeature ( void ) ;<br />
BOOL DR SetFeature ( void ) ;<br />
81 BOOL DR VendorCmnd( void ) ;<br />
// t h i s t a b l e i s used by t h e epcs macro<br />
const char code EPCS Offset Lookup Table [ ] =<br />
{<br />
86 0 , // EP1OUT<br />
1 , // EP1IN<br />
2 , // EP2OUT<br />
2 , // EP2IN<br />
3 , // EP4OUT<br />
91 3 , // EP4IN<br />
4 , // EP6OUT<br />
4 , // EP6IN<br />
5 , // EP8OUT<br />
5 , // EP8IN<br />
96 } ;<br />
// macro f o r g e n e r a t i n g t h e address o f an endpoint ’ s c o n t r o l and s t a t u s r e g i s t e r<br />
(EPnCS)<br />
#define epcs (EP) ( EPCS Offset Lookup Table [ ( EP & 0x7E ) | (EP > 128) ] + 0xE6A1)<br />
101 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
// Code<br />
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
// Task d i s p a t c h e r<br />
106 void main ( void )<br />
{<br />
DWORD i ;<br />
WORD o f f s e t ;<br />
DWORD DevDescrLen ;<br />
111 DWORD j =0;<br />
WORD IntDescrAddr ;<br />
WORD ExtDescrAddr ;<br />
// I n i t i a l i z e Global S t a t e s<br />
116 S l e e p = FALSE; // D i s a b l e s l e e p mode<br />
Rwuen = FALSE; // D i s a b l e remote wakeup<br />
S e l f p w r = FALSE ; // D i s a b l e s e l f powered<br />
GotSUD = FALSE; // Clear ”Got s e t u p data ” f l a g<br />
121 // I n i t i a l i z e user d e v i c e<br />
TD Init ( ) ;<br />
// The f o l l o w i n g s e c t i o n o f code i s used to r e l o c a t e t h e d e s c r i p t o r t a b l e .<br />
// Since t h e SUDPTRH and SUDPTRL are a s s i g n e d t h e address o f t h e d e s c r i p t o r<br />
126 // t a b l e , t h e d e s c r i p t o r t a b l e must be l o c a t e d in on−p a r t memory .<br />
Project Report 59
E. Quellcode<br />
// The 4K demo t o o l s l o c a t e a l l code s e c t i o n s in e x t e r n a l memory .<br />
// The d e s c r i p t o r t a b l e i s r e l o c a t e d by t h e frameworks ONLY i f i t i s found<br />
// to be l o c a t e d in e x t e r n a l memory .<br />
pDeviceDscr = (WORD)&DeviceDscr ;<br />
131 pDeviceQualDscr = (WORD)&DeviceQualDscr ;<br />
pHighSpeedConfigDscr = (WORD)&HighSpeedConfigDscr ;<br />
pFullSpeedConfigDscr = (WORD)&FullSpeedConfigDscr ;<br />
pStringDscr = (WORD)&S t r i n g D s c r ;<br />
136 i f (EZUSB HIGHSPEED( ) )<br />
{<br />
pConfigDscr = pHighSpeedConfigDscr ;<br />
pOtherConfigDscr = pFullSpeedConfigDscr ;<br />
}<br />
141 else<br />
{<br />
pConfigDscr = pFullSpeedConfigDscr ;<br />
pOtherConfigDscr = pHighSpeedConfigDscr ;<br />
}<br />
146<br />
i f ( (WORD)&DeviceDscr & 0 xe000 )<br />
{<br />
IntDescrAddr = INTERNAL DSCR ADDR;<br />
ExtDescrAddr = (WORD)&DeviceDscr ;<br />
151 DevDescrLen = (WORD)&UserDscr − (WORD)&DeviceDscr + 2 ;<br />
for ( i = 0 ; i < DevDescrLen ; i ++)<br />
∗ ( (BYTE xdata ∗) IntDescrAddr+i ) = 0xCD;<br />
for ( i = 0 ; i < DevDescrLen ; i ++)<br />
∗ ( (BYTE xdata ∗) IntDescrAddr+i ) = ∗ ( (BYTE xdata ∗) ExtDescrAddr+i ) ;<br />
156 pDeviceDscr = IntDescrAddr ;<br />
o f f s e t = (WORD)&DeviceDscr − INTERNAL DSCR ADDR;<br />
pDeviceQualDscr −= o f f s e t ;<br />
pConfigDscr −= o f f s e t ;<br />
pOtherConfigDscr −= o f f s e t ;<br />
161 pHighSpeedConfigDscr −= o f f s e t ;<br />
pFullSpeedConfigDscr −= o f f s e t ;<br />
pStringDscr −= o f f s e t ;<br />
}<br />
166 EZUSB IRQ ENABLE( ) ; // Enable USB i n t e r r u p t (INT2)<br />
EZUSB ENABLE RSMIRQ( ) ; // Wake−up i n t e r r u p t<br />
INTSETUP |= (bmAV2EN | bmAV4EN) ; // Enable INT 2 & 4 a u t o v e c t o r i n g<br />
171 USBIE |= bmSUDAV | bmSUTOK | bmSUSP | bmURES | bmHSGRANT; // Enable s e l e c t e d<br />
i n t e r r u p t s<br />
EA = 1 ; // Enable 8051 i n t e r r u p t s<br />
#ifndef NO RENUM<br />
// Renumerate i f n e c e s s a r y . Do t h i s by c h e c k i n g t h e renum b i t . I f i t<br />
176 // i s a l r e a d y set , t h e r e i s no need to renumerate . The renum b i t w i l l<br />
// a l r e a d y be s e t i f t h i s firmware was loaded from an eeprom .<br />
i f ( ! ( USBCS & bmRENUM) )<br />
{<br />
EZUSB Discon (TRUE) ; // renumerate<br />
181 }<br />
#endif<br />
// u n c o n d i t i o n a l l y re−connect . I f we loaded from eeprom we are<br />
// d i s c o n n e c t e d and need to connect . I f we j u s t renumerated t h i s<br />
186 // i s not n e c e s s a r y but doesn ’ t hurt anything<br />
USBCS &=˜bmDISCON;<br />
CKCON = (CKCON&(˜bmSTRETCH) ) | FW STRETCH VALUE; // Set s t r e t c h to 0 ( a f t e r<br />
renumeration )<br />
60 Matthias Zurbrügg, Christoph Zimmermann
E.1. Firmware<br />
191 // c l e a r t h e S l e e p f l a g .<br />
S l e e p = FALSE;<br />
// Task Dispatcher<br />
while (TRUE)<br />
// Main Loop<br />
196 {<br />
i f (GotSUD) // Wait f o r SUDAV<br />
{<br />
SetupCommand ( ) ; // Implement s e t u p command<br />
GotSUD = FALSE ; // Clear SUDAV f l a g<br />
201 }<br />
// P o l l User Device<br />
// NOTE: I d l e mode s t o p s t h e p r o c e s s o r c l o c k . There are only two<br />
// ways out o f i d l e mode , t h e WAKEUP pin , and d e t e c t i o n o f t h e USB<br />
206 // resume s t a t e on t h e USB bus . The timers w i l l s t o p and t h e<br />
// p r o c e s s o r w i l l not wake up on any o t h e r i n t e r r u p t s .<br />
i f ( S l e e p )<br />
{<br />
i f ( TD Suspend ( ) )<br />
211 {<br />
S l e e p = FALSE; // Clear t h e ”go to s l e e p ” f l a g . Do i t here<br />
to p r e v e n t any race c o n d i t i o n between wakeup and t h e next s l e e p .<br />
do<br />
{<br />
EZUSB Susp ( ) ; // Place p r o c e s s o r in i d l e mode .<br />
216 }<br />
while ( ! Rwuen && EZUSB EXTWAKEUP( ) ) ;<br />
// Must continue to go back i n t o suspend i f t h e h o s t has d i s a b l e d<br />
remote wakeup<br />
// ∗and∗ t h e wakeup was caused by t h e e x t e r n a l wakeup pin .<br />
221 // 8051 a c t i v i t y w i l l resume here due to USB bus or Wakeup# pin<br />
a c t i v i t y .<br />
EZUSB Resume ( ) ; // I f source i s t h e Wakeup# pin , s i g n a l t h e h o s t to<br />
Resume .<br />
TD Resume ( ) ;<br />
}<br />
}<br />
226 TD Poll ( ) ;<br />
}<br />
}<br />
// Device r e q u e s t p a r s e r<br />
231 void SetupCommand ( void )<br />
{<br />
void ∗ d s c r p t r ;<br />
switch (SETUPDAT[ 1 ] )<br />
236 {<br />
case SC GET DESCRIPTOR : // ∗∗∗ Get D e s c r i p t o r<br />
i f ( DR GetDescriptor ( ) )<br />
switch (SETUPDAT[ 3 ] )<br />
{<br />
241 case GD DEVICE: // Device<br />
SUDPTRH = MSB( pDeviceDscr ) ;<br />
SUDPTRL = LSB( pDeviceDscr ) ;<br />
break ;<br />
case GD DEVICE QUALIFIER : // Device Q u a l i f i e r<br />
246 SUDPTRH = MSB( pDeviceQualDscr ) ;<br />
SUDPTRL = LSB( pDeviceQualDscr ) ;<br />
break ;<br />
case GD CONFIGURATION: // C o n f i g u r a t i o n<br />
SUDPTRH = MSB( pConfigDscr ) ;<br />
251 SUDPTRL = LSB( pConfigDscr ) ;<br />
break ;<br />
Project Report 61
E. Quellcode<br />
case GD OTHER SPEED CONFIGURATION: // Other Speed C o n f i g u r a t i o n<br />
SUDPTRH = MSB( pOtherConfigDscr ) ;<br />
SUDPTRL = LSB( pOtherConfigDscr ) ;<br />
256 break ;<br />
case GD STRING : // S t r i n g<br />
i f ( d s c r p t r = ( void ∗) EZUSB GetStringDscr (SETUPDAT[ 2 ] ) )<br />
{<br />
SUDPTRH = MSB( d s c r p t r ) ;<br />
261 SUDPTRL = LSB( d s c r p t r ) ;<br />
}<br />
else<br />
EZUSB STALL EP0 ( ) ; // S t a l l End Point 0<br />
break ;<br />
266 default : // I n v a l i d r e q u e s t<br />
EZUSB STALL EP0 ( ) ; // S t a l l End Point 0<br />
}<br />
break ;<br />
case SC GET INTERFACE : // ∗∗∗ Get I n t e r f a c e<br />
271 DR GetInterface ( ) ;<br />
break ;<br />
case SC SET INTERFACE : // ∗∗∗ Set I n t e r f a c e<br />
D R S e t I n t e r f a c e ( ) ;<br />
break ;<br />
276 case SC SET CONFIGURATION : // ∗∗∗ Set C o n f i g u r a t i o n<br />
DR SetConfiguration ( ) ;<br />
break ;<br />
case SC GET CONFIGURATION: // ∗∗∗ Get C o n f i g u r a t i o n<br />
DR GetConfiguration ( ) ;<br />
281 break ;<br />
case SC GET STATUS : // ∗∗∗ Get S t a t u s<br />
i f ( DR GetStatus ( ) )<br />
switch (SETUPDAT[ 0 ] )<br />
{<br />
286 case GS DEVICE : // Device<br />
EP0BUF [ 0 ] = ( (BYTE)Rwuen
E.1. Firmware<br />
i f (SETUPDAT[ 2 ] == 0)<br />
{<br />
321 ∗(BYTE xdata ∗) epcs (SETUPDAT[ 4 ] ) &= ˜bmEPSTALL;<br />
EZUSB RESET DATA TOGGLE( SETUPDAT[ 4 ] ) ;<br />
}<br />
else<br />
EZUSB STALL EP0 ( ) ; // S t a l l End Point 0<br />
326 break ;<br />
}<br />
break ;<br />
case SC SET FEATURE : // ∗∗∗ Set Feature<br />
i f ( DR SetFeature ( ) )<br />
331 switch (SETUPDAT[ 0 ] )<br />
{<br />
case FT DEVICE : // Device<br />
i f (SETUPDAT[ 2 ] == 1)<br />
Rwuen = TRUE; // Enable Remote Wakeup<br />
336 else i f (SETUPDAT[ 2 ] == 2)<br />
// Set Feature Test Mode . The core h andles t h i s r e q u e s t .<br />
However , i t i s<br />
// n e c e s s a r y f o r t h e firmware to complete t h e handshake phase o f<br />
t h e<br />
// c o n t r o l t r a n s f e r b e f o r e t h e c hip w i l l e n t e r t e s t mode . I t i s<br />
a l s o<br />
// n e c e s s a r y f o r FX2 to be p h y s i c a l l y d i s c o n n e c t e d (D+ and D−)<br />
341 // from t h e h o s t b e f o r e i t w i l l e n t e r t e s t mode .<br />
break ;<br />
else<br />
EZUSB STALL EP0 ( ) ; // S t a l l End Point 0<br />
break ;<br />
346 case FT ENDPOINT: // End Point<br />
∗(BYTE xdata ∗) epcs (SETUPDAT[ 4 ] ) |= bmEPSTALL;<br />
break ;<br />
}<br />
break ;<br />
351 default : // ∗∗∗ I n v a l i d Command<br />
i f (DR VendorCmnd ( ) )<br />
EZUSB STALL EP0 ( ) ; // S t a l l End Point 0<br />
}<br />
356 // Acknowledge handshake phase o f d e v i c e r e q u e s t<br />
EP0CS |= bmHSNAK;<br />
}<br />
// Wake−up i n t e r r u p t handler<br />
361 void r e s u m e i s r ( void ) i n t e r r u p t WKUP VECT<br />
{<br />
EZUSB CLEAR RSMIRQ( ) ;<br />
}<br />
E.1.2. Firmware<br />
1 #pragma NOIV // Do not g e n e r a t e i n t e r r u p t v e c t o r s<br />
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
∗ Diplomwork :<br />
∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
∗<br />
6 ∗ ( ‘ \ ( ) ( ) ( )<br />
∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
∗ | < ’| ) | | School o f Engineering and<br />
∗ | ( ) ) | | | | | | Information Technology<br />
∗ ( / ’( ) ( ) ( )<br />
11 ∗<br />
∗<br />
Project Report 63
E. Quellcode<br />
∗ Author : Matthias Zurbrügg<br />
∗ Date o f c r e a t i o n : 22.11.2006<br />
∗ D e s c r i p t i o n :<br />
16 ∗ Source code o f Cypress EZ−USB FX2 Firmware<br />
∗<br />
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
#include ” fx2 . h”<br />
21 #include ” f x 2 r e g s . h”<br />
#include ” f x 2 s d l y . h” // SYNCDELAY macro , see S e c t i o n 15.14 o f FX2 Tech .<br />
// Ref . Manual f o r usage d e t a i l s .<br />
#include ” g p i f r d w r f u n c . h”<br />
#include ” s p i f l a s h r d w r f u n c . h”<br />
26 #include ” f p g a c f g f u n c . h”<br />
#include ” eeprom rd wr func . h”<br />
// firmware v e r s i o n (max t h r e e d i g i t s )<br />
#define f w v e r d i g i t 0 ’ 1 ’<br />
31 #define f w v e r d i g i t 1 ’ . ’<br />
#define f w v e r d i g i t 2 ’ 0 ’<br />
#define f w v e r d i g i t 3 ’ 1 ’<br />
// Cypres b i t masks<br />
36 #define bmEP0BSY 0 x01<br />
#define bmEP1OUTBSY 0 x02<br />
#define bmEP1INBSY 0 x04<br />
// Defines f o r EEPROM communications<br />
41 #define w r i t e n o k 1<br />
#define w r i t e o k 0<br />
#define read nok 1<br />
#define read ok 0<br />
#define i n i t 0<br />
46 #define i d l e 3<br />
// Cypres v a r i a b l e s<br />
extern BOOL GotSUD ; // Received s e t u p data f l a g<br />
extern BOOL S l e e p ;<br />
51 extern BOOL Rwuen ;<br />
extern BOOL S e l f p w r ;<br />
BYTE C o n f i g u r a t i o n ; // Current c o n f i g u r a t i o n<br />
BYTE A l t e r n a t e S e t t i n g ; // A l t e r n a t e s e t t i n g s<br />
56<br />
// V a r i a b l e s f o r GPIF communications<br />
BOOL i n e n a b l e = FALSE ; // f l a g to e n a b l e IN t r a n s f e r s<br />
BOOL f i f o r d e n a b l e = FALSE; // f l a g to e n a b l e GPIF FIFO READ Transaction<br />
BOOL f i f o r d i n t = FALSE; // GPIF FIFO READ Transaction i n t e r r u p t f l a g<br />
61 BOOL enum high speed = FALSE; // f l a g to l e t firmware know FX2 enumerated at<br />
h i g h speed<br />
// V a r i a b l e s f o r EEPROM coummunications<br />
BOOL eeprom write mode = FALSE; // s e t eeprome write mode to f a l s e<br />
BOOL s t a r t t r a n s a c t i o n = 1 ;<br />
BOOL eeprom read mode = FALSE;<br />
66 BYTE e e p r o m r e a d s t a t e = i d l e ; // s e t eeprom read s t a t e on i d l e<br />
WORD eeprom adress = 0 ;<br />
WORD r e a d c o u n t = 0 ; // v a l u e o f number o f b y t e s to read<br />
// V a r i a b l e s f o r FPGA c o n f i g u r a t i o n<br />
BOOL fpga cfg m ode = FALSE; // FPGA c o n f i g u r a t i o n mode v a r i a b l e<br />
71 BOOL done ack = FALSE ; // v a r i a b l e to g i v e vendor r e q u e s t DONE<br />
acknoledgement<br />
// V a r i a b l e s f o r SPI Flash communications<br />
BOOL s p i f l a s h w r i t e m o d e = FALSE;<br />
BOOL s p i f l a s h r e a d m o d e = FALSE;<br />
BOOL f l a s h r d e n ;<br />
76 BOOL new cfg = 1 ;<br />
64 Matthias Zurbrügg, Christoph Zimmermann
E.1. Firmware<br />
unsigned long s p i f l a s h a d r e s s =0;<br />
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
// Task Dispatcher hooks<br />
81 // The f o l l o w i n g hooks are c a l l e d by t h e t a s k d i s p a t c h e r .<br />
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
void G p i f I n i t ( void ) ; // f u n c t i o n p r o t o t y p e from g p i f . c<br />
void TD Init ( void ) // C a l l e d once at s t a r t u p<br />
86 {<br />
// s e t t h e CPU c l o c k to 48MHz<br />
CPUCS = ( (CPUCS & ˜bmCLKSPD) | bmCLKSPD1) ;<br />
SYNCDELAY;<br />
91 EP1OUTCFG = 0xA0 ; // always OUT, v a l i d , b u l k<br />
EP1INCFG = 0xA0 ; // always IN , v a l i d , b u l k<br />
SYNCDELAY;<br />
EP2CFG = 0xA2 ; // EP2OUT, bulk , s i z e 512 , 2x b u f f e r e d<br />
SYNCDELAY;<br />
96 EP4CFG = 0xE0 ; // EP4IN , bulk , s i z e 512 , 2x b u f f e r e d<br />
SYNCDELAY;<br />
EP6CFG = 0xA2 ; // EP6OUT, bulk , s i z e 512 , 2x b u f f e r e d<br />
SYNCDELAY;<br />
EP8CFG = 0xE0 ; // EP8IN , bulk , s i z e 512 , 2x b u f f e r e d<br />
101 SYNCDELAY;<br />
// out e n d p o i n t s do not come up armed<br />
// s i n c e t h e d e f a u l t s are d o u b l e b u f f e r e d we must w r i t e dummy b y t e counts t w i c e<br />
SYNCDELAY;<br />
106 EP2BCL = 0 x80 ; // arm EP2OUT by w r i t i n g b y t e count w/ s k i p .<br />
SYNCDELAY;<br />
EP2BCL = 0 x80 ;<br />
SYNCDELAY;<br />
111 FIFORESET = 0 x80 ; // s e t NAKALL b i t to NAK a l l t r a n s f e r s from h o s t<br />
/∗SYNCDELAY;<br />
FIFORESET = 0 x02 ; // r e s e t EP2 FIFO<br />
SYNCDELAY;<br />
FIFORESET = 0 x04 ; // r e s e t EP4 FIFO<br />
116 SYNCDELAY; ∗/<br />
FIFORESET = 0 x06 ; // r e s e t EP6 FIFO<br />
SYNCDELAY;<br />
FIFORESET = 0 x08 ; // r e s e t EP8 FIFO<br />
SYNCDELAY;<br />
121 FIFORESET = 0 x00 ; // c l e a r NAKALL b i t to resume normal o p e r a t i o n<br />
SYNCDELAY;<br />
EP6FIFOCFG = 0 x00 ; // a l l o w core to see zero to one t r a n s i t i o n o f auto out b i t<br />
SYNCDELAY;<br />
126 EP6FIFOCFG = 0 x10 ; // auto out mode , d i s a b l e PKTEND zero l e n g t h send , b y t e ops<br />
SYNCDELAY;<br />
EP8FIFOCFG = 0 x08 ; // auto in mode , d i s a b l e PKTEND zero l e n g t h send , b y t e ops<br />
SYNCDELAY;<br />
EP1OUTBC = 0 x00 ; // arm EP1OUT by w r i t i n g any v a l u e to EP1OUTBC r e g i s t e r<br />
131<br />
s p i f l a s h i n i t ( ) ; // i n i t i a l i z e Port A [ 0 : 3 ] ( f u n c t i o n in s p i f l a s h r d w r f u n c . c )<br />
f p g a c f g i n i t ( ) ; // i n i t i a l i z e Port A [ 4 : 7 ] , Port B and CTL0 f o r FPGA<br />
c o n f i g u r a t i o n ( f u n c t i o n in f p g a c f g f u n c . c )<br />
b o o t l o a d c f g ( ) ; // s t a r t l o a d i n g FPGA c o n f i g u r a t i o n from SPI Flash in FPGA<br />
( f u n c t i o n in s p i f l a s h r d w r f u n c . c )<br />
136 G p i f I n i t ( ) ; // i n i t i a l i z e GPIF r e g i s t e r s ( f u n c t i o n in g p i f . c )<br />
EZUSB InitI2C ( ) ;<br />
//PORTACFG = bmINT0 ; // PA0 t a k e s on INT0/ a l t e r n a t e f u n c t i o n<br />
Project Report 65
E. Quellcode<br />
141 //OEA |= 0x0C ; // i n i t i a l i z e PA3 and PA2 p o r t i /o p i n s as o u t p u t s<br />
//PORTECFG = 0x07 ;<br />
}<br />
void TD Poll ( void ) // c a l l e d r e p e a t e d l y w h i l e t h e d e v i c e i s i d l e<br />
146 {<br />
i f ( ! ( EP2468STAT & bmEP2EMPTY ) ) // i f t h e r e ’ s a p a c k e t in t h e p e r i p h e r a l<br />
domain f o r EP2<br />
{<br />
i f ( fpga cfg m ode == TRUE) // vendor command 0xC1 f o r FPGA c o n f i g u r a t i o n<br />
mode<br />
{<br />
151 f p g a c f g i n i t ( ) ; // i n i t a l i z e i /o l i n e s f o r FPGA c o n f i g u r a t i o n mode<br />
( f u n c t i o n in f p g a c f g f u n c . c )<br />
f p g a c f g ( ) ; // c a l l FPGA c o n f i g u r a t i o n prozedure ( f u n c t i o n in<br />
f p g a c f g f u n c . c )<br />
}<br />
i f ( eeprom write mode == TRUE) // vendor command 0xC2 l o ad firmware in EEPROM<br />
156 {<br />
eeprom wr ( ) ; // c a l l EEPROM w r i t e<br />
}<br />
i f ( s p i f l a s h w r i t e m o d e == TRUE) // vendor command 0xC4 l o ad FPGA<br />
c o n f i g u r a t i o n in SPI Flash , v a l u e in EP0 i s c o n f i g u r a t i o n p a r t (0 or 1)<br />
−−−−>> to do<br />
161 {<br />
s p i f l a s h w r ( ) ; // c a l l SPI Flash w r i t e<br />
}<br />
}<br />
166 i f ( eeprom read mode == TRUE) // vendor command 0xC3 read firmware from<br />
EEPROM, v a l u e in EP0 i s number o f b y t e s to read<br />
{<br />
eeprom rd ( r e a d c o u n t ) ; // c a l l EEPROM read<br />
}<br />
171 i f ( s p i f l a s h r e a d m o d e == TRUE) // vendor command 0xC5 read FPGA<br />
c o n f i g u r a t i o n from SPI Flash , v a l u e in EP0 i s number o f b y t e s to read<br />
{<br />
s p i f l a s h r d ( ) ; // c a l l SPI Flash read<br />
}<br />
176 i f ( ! ( EP2468STAT & bmEP6EMPTY ) ) // i f t h e r e ’ s a p a c k e t in t h e p e r i p h e r a l<br />
domain f o r EP6<br />
{<br />
gpif wr waveform ( ) ; // c a l l f u n c t i o n to s t a r t a GPIF FIFO WRITE<br />
Transaction ( f u n c t i o n in g p i f r d w r f u n c . c )<br />
i n e n a b l e = TRUE;<br />
}<br />
181 i f ( i n e n a b l e ) { // s t a r t communication<br />
g p i f r d w a v e f o r m ( ) ; // c a l l f u n c t i o n to s t a r t a GPIF FIFO READ<br />
Transaction ( f u n c t i o n in g p i f r d w r f u n c . c )<br />
}<br />
186 i f ( ! ( EP01STAT & bmEP1OUTBSY) )<br />
{<br />
// handle OUTs to EP1OUT<br />
}<br />
191 i f ( ! ( EP01STAT & bmEP1INBSY) )<br />
{<br />
// handle INs to EP1IN<br />
}<br />
}<br />
66 Matthias Zurbrügg, Christoph Zimmermann
E.1. Firmware<br />
196<br />
201<br />
206<br />
211<br />
216<br />
BOOL TD Suspend ( void ) // C a l l e d b e f o r e t h e d e v i c e goes i n t o suspend mode<br />
{<br />
return (TRUE) ;<br />
}<br />
BOOL TD Resume ( void ) // C a l l e d a f t e r t h e d e v i c e resumes<br />
{<br />
return (TRUE) ;<br />
}<br />
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
// Device Request hooks<br />
// The f o l l o w i n g hooks are c a l l e d by t h e end p o i n t 0 d e v i c e r e q u e s t p a r s e r .<br />
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
BOOL DR GetDescriptor ( void )<br />
{<br />
return (TRUE) ;<br />
}<br />
BOOL DR SetConfiguration ( void ) // C a l l e d when a Set C o n f i g u r a t i o n command i s<br />
r e c e i v e d<br />
{<br />
i f ( EZUSB HIGHSPEED( ) )<br />
221 { // FX2 enumerated at h i g h speed<br />
SYNCDELAY;<br />
EP6AUTOINLENH = 0 x02 ; // s e t AUTOIN commit l e n g t h to 512 b y t e s<br />
SYNCDELAY;<br />
EP6AUTOINLENL = 0 x00 ;<br />
226 SYNCDELAY;<br />
enum high speed = TRUE;<br />
}<br />
else<br />
{ // FX2 enumerated at f u l l speed<br />
231 SYNCDELAY;<br />
EP6AUTOINLENH = 0 x00 ; // s e t AUTOIN commit l e n g t h to 64 b y t e s<br />
SYNCDELAY;<br />
EP6AUTOINLENL = 0 x40 ;<br />
SYNCDELAY;<br />
236 enum high speed = FALSE;<br />
}<br />
241 }<br />
C o n f i g u r a t i o n = SETUPDAT [ 2 ] ;<br />
return (TRUE) ; // Handled by user code<br />
BOOL DR GetConfiguration ( void ) // C a l l e d when a Get C o n f i g u r a t i o n command i s<br />
r e c e i v e d<br />
{<br />
EP0BUF [ 0 ] = C o n f i g u r a t i o n ;<br />
246 EP0BCH = 0 ;<br />
EP0BCL = 1 ;<br />
return (TRUE) ; // Handled by user code<br />
}<br />
251 BOOL D R S e t I n t e r f a c e ( void ) // C a l l e d when a Set I n t e r f a c e command i s r e c e i v e d<br />
{<br />
A l t e r n a t e S e t t i n g = SETUPDAT [ 2 ] ;<br />
return (TRUE) ; // Handled by user code<br />
}<br />
256<br />
BOOL DR GetInterface ( void ) // C a l l e d when a Get I n t e r f a c e command i s r e c e i v e d<br />
{<br />
EP0BUF [ 0 ] = A l t e r n a t e S e t t i n g ;<br />
Project Report 67
E. Quellcode<br />
EP0BCH = 0 ;<br />
261 EP0BCL = 1 ;<br />
return (TRUE) ; // Handled by user code<br />
}<br />
BOOL DR GetStatus ( void )<br />
266 {<br />
return (TRUE) ;<br />
}<br />
BOOL DR ClearFeature ( void )<br />
271 {<br />
return (TRUE) ;<br />
}<br />
BOOL DR SetFeature ( void )<br />
276 {<br />
return (TRUE) ;<br />
}<br />
#define FPGA CFG 0xC1 // vendor r e q u e s t f o r FPGA c o n f i g u r a t i o n mode<br />
281 #define EEPROM WRITE 0xC2 // vendor r e q u e s t l o a d firmware in EEPROM<br />
#define EEPROM READ 0xC3 // vendor r e q u e s t read firmware from EEPROM, v a l u e in<br />
EP0 i s number o f b y t e s to read<br />
#define FLASH WRITE 0xC4 // vendor r e q u e s t l o a d FPGA c o n f i g u r a t i o n in SPI Flash ,<br />
v a l u e in EP0 i s c o n f i g u r a t i o n p a r t (0 or 1) −−−−>> to do<br />
#define FLASH READ 0xC5 // vendor r e q u e s t read FPGA c o n f i g u r a t i o n from SPI<br />
Flash<br />
#define DOWNLOADOK 0xC6 // vendor r e q u e s t f o r complete data t r a n s f e r<br />
286 //#d e f i n e GPIF READ 0xC9 // e n a b l e IN t r a n s f e r s f o r GPIF communication<br />
#define FW VERSION 0xB1 // g e t firmware v e r s i o n<br />
#define DONE REQ 0xB2 // g e t DONE b i t from FPGA<br />
BOOL DR VendorCmnd( void )<br />
291 {<br />
switch (SETUPDAT[ 1 ] )<br />
{<br />
case FPGA CFG:<br />
{<br />
296 fpga cfg m ode = TRUE; // s e t FPGA c o n f i g u r a t i o n mode<br />
∗EP0BUF = FPGA CFG; // l o o p b a c k from vendor command<br />
EP0BCH = 0 ;<br />
EP0BCL = 1 ; // Arm endpoint with # b y t e s to t r a n s f e r<br />
EP0CS |= bmHSNAK; // Acknowledge handshake phase o f d e v i c e r e q u e s t<br />
301 break ;<br />
}<br />
case EEPROM WRITE:<br />
{<br />
eeprom write mode = TRUE; // s e t EEPROME w r i t e mode<br />
306 ∗EP0BUF = EEPROM WRITE; // l o o p b a c k from vendor command<br />
EP0BCH = 0 ;<br />
EP0BCL = 1 ; // Arm endpoint with # b y t e s to t r a n s f e r<br />
EP0CS |= bmHSNAK; // Acknowledge handshake phase o f d e v i c e r e q u e s t<br />
break ;<br />
311 }<br />
case EEPROM READ:<br />
{<br />
e e p r o m r e a d s t a t e = i n i t ; // s e t i n i t i a t i o n s t a t e<br />
EP0BCL = 0 ; // re−arm EP0<br />
316 while (EP01STAT & bmEP0BSY) ; // wait u n t i l EP0 i s a v a i l a b l e to be<br />
a c c e s s e d by CPU<br />
r e a d c o u n t = EP0BUF [ 0 ] ; // read high b y t e number o f b y t e s to read<br />
r e a d c o u n t = ( r e a d c o u n t
E.1. Firmware<br />
EP0CS |= bmHSNAK; ∗/ // Acknowledge handshake phase o f d e v i c e<br />
r e q u e s t<br />
321 break ;<br />
}<br />
case FLASH WRITE:<br />
{<br />
s p i f l a s h w r i t e m o d e = TRUE; // s e t EEPROME w r i t e mode<br />
326 ∗EP0BUF = EEPROM READ; // l o o p b a c k from vendor command<br />
EP0BCH = 0 ;<br />
EP0BCL = 1 ; // Arm endpoint with # b y t e s to t r a n s f e r<br />
EP0CS |= bmHSNAK; // Acknowledge handshake phase o f d e v i c e r e q u e s t<br />
break ;<br />
331 }<br />
case FLASH READ:<br />
{<br />
s p i f l a s h r e a d m o d e = TRUE; // s e t EEPROME w r i t e mode<br />
∗EP0BUF = EEPROM READ; // l o o p b a c k from vendor command<br />
336 EP0BCH = 0 ;<br />
EP0BCL = 1 ; // Arm endpoint with # b y t e s to t r a n s f e r<br />
EP0CS |= bmHSNAK; // Acknowledge handshake phase o f d e v i c e r e q u e s t<br />
break ;<br />
}<br />
341 case DOWNLOADOK:<br />
{<br />
// SPI Flash d e f a u l t c o n f i g<br />
new cfg = 1 ;<br />
s p i f l a s h a d r e s s = 0 ;<br />
346 // EEPROM d e f a u l t c o n f i g<br />
eeprom adress = 0 ; // c l e a r a d r e s s v a l u e<br />
eeprom write mode = FALSE;<br />
∗EP0BUF = DOWNLOADOK; // l o o p b a c k from vendor command<br />
351 EP0BCH = 0 ;<br />
EP0BCL = 1 ; // Arm endpoint with # b y t e s to t r a n s f e r<br />
EP0CS |= bmHSNAK; // Acknowledge handshake phase o f d e v i c e r e q u e s t<br />
break ;<br />
}<br />
356 case FW VERSION:<br />
{<br />
EP0BUF [ 0 ] = f w v e r d i g i t 0 ; // l o o p b a c k from vendor command<br />
EP0BUF [ 1 ] = f w v e r d i g i t 1 ;<br />
EP0BUF [ 2 ] = f w v e r d i g i t 2 ;<br />
361 EP0BUF [ 3 ] = f w v e r d i g i t 3 ;<br />
EP0BCH = 0 ;<br />
EP0BCL = 4 ; // Arm endpoint with # b y t e s to t r a n s f e r<br />
EP0CS |= bmHSNAK; // Acknowledge handshake phase o f d e v i c e r e q u e s t<br />
break ;<br />
366 }<br />
case DONE REQ:<br />
{<br />
i f ( done ack == TRUE)<br />
{<br />
371 done ack = FALSE ;<br />
∗EP0BUF = DONE REQ;<br />
} else<br />
{<br />
∗EP0BUF = 0 ;<br />
376 }<br />
EP0BCH = 0 ;<br />
EP0BCL = 1 ;<br />
EP0CS |= bmHSNAK;<br />
break ;<br />
381 }<br />
default :<br />
return (TRUE) ;<br />
}<br />
Project Report 69
E. Quellcode<br />
386 return (FALSE) ;<br />
}<br />
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
// USB I n t e r r u p t Handlers<br />
391 // The f o l l o w i n g f u n c t i o n s are c a l l e d by t h e USB i n t e r r u p t jump t a b l e .<br />
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
// Setup Data A v a i l a b l e I n t e r r u p t Handler<br />
void ISR Sudav ( void ) i n t e r r u p t 0<br />
396 {<br />
GotSUD = TRUE; // Set f l a g<br />
EZUSB IRQ CLEAR( ) ;<br />
USBIRQ = bmSUDAV; // Clear SUDAV IRQ<br />
}<br />
401<br />
// Setup Token I n t e r r u p t Handler<br />
void ISR Sutok ( void ) i n t e r r u p t 0<br />
{<br />
EZUSB IRQ CLEAR( ) ;<br />
406 USBIRQ = bmSUTOK; // Clear SUTOK IRQ<br />
}<br />
void ISR Sof ( void ) i n t e r r u p t 0<br />
{<br />
411 EZUSB IRQ CLEAR( ) ;<br />
USBIRQ = bmSOF; // Clear SOF IRQ<br />
}<br />
void ISR Ures ( void ) i n t e r r u p t 0<br />
416 {<br />
// whenever we g e t a USB r e s e t , we s h o u l d r e v e r t to f u l l speed mode<br />
pConfigDscr = pFullSpeedConfigDscr ;<br />
( (CONFIGDSCR xdata ∗) pConfigDscr )−>type = CONFIG DSCR;<br />
pOtherConfigDscr = pHighSpeedConfigDscr ;<br />
421 ( (CONFIGDSCR xdata ∗) pOtherConfigDscr )−>type = OTHERSPEED DSCR;<br />
EZUSB IRQ CLEAR( ) ;<br />
USBIRQ = bmURES; // Clear URES IRQ<br />
}<br />
426<br />
void ISR Susp ( void ) i n t e r r u p t 0<br />
{<br />
S l e e p = TRUE;<br />
EZUSB IRQ CLEAR( ) ;<br />
431 USBIRQ = bmSUSP;<br />
}<br />
void ISR Highspeed ( void ) i n t e r r u p t 0<br />
{<br />
436 i f (EZUSB HIGHSPEED( ) )<br />
{<br />
pConfigDscr = pHighSpeedConfigDscr ;<br />
( (CONFIGDSCR xdata ∗) pConfigDscr )−>type = CONFIG DSCR;<br />
pOtherConfigDscr = pFullSpeedConfigDscr ;<br />
441 ( (CONFIGDSCR xdata ∗) pOtherConfigDscr )−>type = OTHERSPEED DSCR;<br />
}<br />
EZUSB IRQ CLEAR( ) ;<br />
USBIRQ = bmHSGRANT;<br />
446 }<br />
void ISR Ep0ack ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
void ISR Stub ( void ) i n t e r r u p t 0<br />
70 Matthias Zurbrügg, Christoph Zimmermann
E.1. Firmware<br />
451 {<br />
}<br />
void ISR Ep0in ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
456 void ISR Ep0out ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
void ISR Ep1in ( void ) i n t e r r u p t 0<br />
{<br />
461 }<br />
void ISR Ep1out ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
void ISR Ep2inout ( void ) i n t e r r u p t 0<br />
466 {<br />
}<br />
void ISR Ep4inout ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
471 void ISR Ep6inout ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
void ISR Ep8inout ( void ) i n t e r r u p t 0<br />
{<br />
476 }<br />
void ISR Ibn ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
void ISR Ep0pingnak ( void ) i n t e r r u p t 0<br />
481 {<br />
}<br />
void ISR Ep1pingnak ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
486 void ISR Ep2pingnak ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
void ISR Ep4pingnak ( void ) i n t e r r u p t 0<br />
{<br />
491 }<br />
void ISR Ep6pingnak ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
void ISR Ep8pingnak ( void ) i n t e r r u p t 0<br />
496 {<br />
}<br />
void I S R E r r o r l i m i t ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
501 void ISR Ep2piderror ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
void ISR Ep4piderror ( void ) i n t e r r u p t 0<br />
{<br />
506 }<br />
void ISR Ep6piderror ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
void ISR Ep8piderror ( void ) i n t e r r u p t 0<br />
511 {<br />
}<br />
void ISR Ep2pflag ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
516 void ISR Ep4pflag ( void ) i n t e r r u p t 0<br />
Project Report 71
E. Quellcode<br />
{<br />
}<br />
void ISR Ep6pflag ( void ) i n t e r r u p t 0<br />
{<br />
521 }<br />
void ISR Ep8pflag ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
void ISR Ep2eflag ( void ) i n t e r r u p t 0<br />
526 {<br />
}<br />
void ISR Ep4eflag ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
531 void ISR Ep6eflag ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
void ISR Ep8eflag ( void ) i n t e r r u p t 0<br />
{<br />
536 }<br />
void I S R E p 2 f f l a g ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
void I S R E p 4 f f l a g ( void ) i n t e r r u p t 0<br />
541 {<br />
}<br />
void I S R E p 6 f f l a g ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
546 void I S R E p 8 f f l a g ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
void ISR GpifComplete ( void ) i n t e r r u p t 0<br />
{<br />
551 }<br />
void ISR GpifWaveform ( void ) i n t e r r u p t 0<br />
{<br />
}<br />
E.1.3. FPGA Konfiguration<br />
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
∗ Diplomwork :<br />
∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
∗<br />
5 ∗ ( ‘ \ ( ) ( ) ( )<br />
∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
∗ | < ’| ) | | School o f Engineering and<br />
∗ | ( ) ) | | | | | | Information Technology<br />
∗ ( / ’( ) ( ) ( )<br />
10 ∗<br />
∗<br />
∗ Author : Matthias Zurbrügg<br />
∗ Date o f c r e a t i o n : 31.10.2006<br />
∗ D e s c r i p t i o n :<br />
15 ∗ Source code FPGA c o n f i g u r a t i o n from Host over USB<br />
∗<br />
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
#include ” fx2 . h”<br />
20 #include ” f x 2 r e g s . h”<br />
#include ” f x 2 s d l y . h” // SYNCDELAY macro<br />
72 Matthias Zurbrügg, Christoph Zimmermann
E.1. Firmware<br />
#define f i l e s i z e 130952 // f i l e s i z e f o r XC3S200 ( important : you must a d j u s t t h i s<br />
s i z e f o r o t h e r d e v i c e s )<br />
#define DONE 0 x41 // vendor r e q u e s t t h a t DONE b i t i s s e t<br />
25<br />
extern BOOL fpga cfg m ode ; // e x t e r n a l v a r i a b l e f o r r e s e t FPGA c o n f i g u r a t i o n mode<br />
extern BOOL done ack ; // e x t e r n a l v a r i a b l e f o r send vendor r e q u e s t DONE<br />
acknoledgement<br />
extern BYTE timer ; // timer v a l u e from timeout timer<br />
30 void G p i f I n i t ( void ) ; // f u n c t i o n p r o t o t y p e from g p i f . c<br />
BOOL busy ; // busy f l a g<br />
unsigned long counter = 0 ; // b y t e counter<br />
35 void f p g a c f g i n i t ( void )<br />
{<br />
IFCONFIG = 0xC0 ;<br />
// IFCLKSRC=1 , FIFOs e x e c u t e s on i n t e r n a l c l k source<br />
// xMHz=1 , 48MHz i n t e r n a l c l k r a t e<br />
40 // IFCLKOE=0 , Don ’ t d r i v e IFCLK pin s i g n a l at 48MHz<br />
// IFCLKPOL=0 , Don ’ t i n v e r t IFCLK pin s i g n a l from i n t e r n a l c l k<br />
// ASYNC=0 , s l a v e FIFOs o p e r a t e synchronously<br />
// GSTATE=0 , d i s a b l e GPIF s t a t e s out on PORTE[ 2 : 0 ]<br />
// IFCFG[ 1 : 0 ] = 0 0 , FX2 in p o r t s mode<br />
45 GPIFABORT = 0xFF ; // a b o r t any waveforms pending<br />
GPIFCTLCFG = 0 ; // TRICTL = 0 , CTL 0 . . 2 as CMOS, Not T r i s t a t a b l e<br />
SYNCDELAY;<br />
OEB = 0xFF ; // Port B a l l p i n s as output<br />
IOB = 0 ; // Set i n i t a l i s a t i o n f o r Port B<br />
50 OEA &= 0xEF ; // Port A b i t 4 as i n p u t f o r I n i t B<br />
OEA |= 0 x20 ; // Port A b i t 5 as output f o r Prog B<br />
PA5 = 1 ; // Set i n i t a l i s a t i o n f o r Prog B<br />
OEA &= 0x7F ; // Port A b i t 7 as i n p u t f o r Done<br />
}<br />
55<br />
void f p g a c f g ( void )<br />
{<br />
WORD count , i ;<br />
60 GPIFIDLECTL &= 0xF9 ; // b r i n g CS B , RDWR B low<br />
PA5 = 0 ; // b r i n g Prog B low b r i n g s t h e d e v i c e in t h e i n i t a l i s a t i o n mode<br />
// and h o l d i t t h e r e<br />
PA5 = 1 ; // b r i n g Prog B b i t h i g h<br />
65<br />
while (PA4 == 0) // i f I n i t B goes h i g h t h e d e v i c e i s in t h e c o n f i g u r a t i o n<br />
l o a d mode<br />
{<br />
;<br />
}<br />
70 TR0 = 1 ; // e n a b l e Timer 0 f o r Timeout<br />
while ( counter < f i l e s i z e )<br />
{<br />
i f ( timer == 61) // 61 timer o v e r f l o w s accord ca . 1 second<br />
{<br />
75 break ; // t h e timeout a b o r t t h e r o u t i n e<br />
}<br />
i f ( ! ( EP2468STAT & bmEP2EMPTY) ) // check EP2 EMPTY( busy ) b i t in EP2468STAT (SFR) ,<br />
core s e t ’ s t h i s b i t when FIFO i s empty<br />
{<br />
// a u t o p o i n t e r source a d r e s s from EP2OUT<br />
80 AUTOPTRH1 = MSB( &EP2FIFOBUF ) ;<br />
AUTOPTRL1 = LSB( &EP2FIFOBUF ) ;<br />
count = (EP2BCH
E. Quellcode<br />
85<br />
{<br />
for ( i = 0 x0000 ; i < count ; i++ )<br />
IOB = EXTAUTODAT1; // d r i v e Port B with data from EP2 FIFO<br />
90 GPIFIDLECTL &= 0xFE ; // b r i n g CCLK low<br />
GPIFIDLECTL |= 0 x01 ; // b r i n g CCLK h i g h<br />
// check f o r busy<br />
do {<br />
95 busy = ( (GPIFREADYSTAT & 0 x02 ) >> 1) ; // read busy b i t<br />
i f ( busy == 1) // i f FPGA busy , t o g g l e CCLK<br />
{<br />
GPIFIDLECTL &= 0xFE ; // b r i n g CCLK low<br />
GPIFIDLECTL |= 0 x01 ; // b r i n g CCLK h i g h<br />
100 }<br />
i f ( timer >= 61) // 61 timer o v e r f l o w s accord ca . 1 second<br />
{<br />
TR0 = 0 ;<br />
break ; // t h e timeout a b o r t t h e r o u t i n e<br />
105 }<br />
} while ( busy == 1) ; // l oop w h i l e busy i s t r u e<br />
}<br />
timer = 0 ; // r e s e t timer v a l u e<br />
SYNCDELAY;<br />
110 EP2BCL = 0 x80 ; // rearm EP2OUT<br />
SYNCDELAY;<br />
}<br />
}<br />
GPIFIDLECTL |= 0 x06 ; // b r i n g CS B , RDWR B h i g h<br />
115<br />
for ( i =0; i
E.1. Firmware<br />
15 ∗ Source code o f EEPROM read / w r i t e f u n c t i o n s<br />
∗<br />
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
#include ” fx2 . h”<br />
20 #include ” f x 2 r e g s . h”<br />
#include ” f x 2 s d l y . h” // SYNCDELAY macro<br />
#define w r i t e n o k 1 // d e f i n i t i o n f o r w r i t e s t a t e<br />
#define w r i t e o k 0 // d e f i n i t i o n f o r w r i t e s t a t e<br />
25 #define i n i t 0 // d e f i n i t i o n f o r read s t a t e<br />
#define read 1 // d e f i n i t i o n f o r read s t a t e<br />
#define ep4in arm 2 // d e f i n i t i o n f o r read s t a t e<br />
#define i d l e 3 // d e f i n i t i o n f o r read s t a t e<br />
#define c o n t r o l b y t e 0xA2 // EEPROM and d e v i c e a d r e s s<br />
30<br />
// e x t e r n BOOL eeprom write mode ;<br />
extern BOOL s t a r t t r a n s a c t i o n ; // f o r s t a r t w r i t e t r a n s a c t i o n with vendor r e q u e s t<br />
EEPROM WRITE<br />
extern BYTE e e p r o m r e a d s t a t e ; // f o r s t a r t read t r a n s a c t i o n with vendor r e q u e s t<br />
EEPROM READ<br />
extern WORD eeprom address ; // f o r r e s e t t h e s t a r t a d r e s s o f EEPROM with vendro<br />
r e q u e s t DOWNLOADOK<br />
35<br />
BOOL w r i t e s t a t e = 1 ; // s e t t h e w r i t e s t a t e on not ok<br />
BYTE loop ;<br />
BYTE c o n t r o l = ( c o n t r o l b y t e >> 1) ; // one l e f t s h i f t because t h e t h e c y p r e s s i 2 c<br />
f u n c t i o n ( show i 2 c . c )<br />
BYTE xdata b u f f e r [ 6 6 ] ; // temporary s t o r e array<br />
40 BYTE l e n g t h ; // l e n g t h o f temporary s t o r e array ( f o r EEPROM w r i t e f u n c t i o n<br />
from Cypress )<br />
WORD bytecount = 0 ; // b y t e counter f o r read f u n c t i o n<br />
void eeprom wr ( void )<br />
45 {<br />
WORD count , i ;<br />
i f ( s t a r t t r a n s a c t i o n == 1) // i f a new firmware download i s s t a r t e d<br />
{<br />
50 b u f f e r [ 0 ] = 0 x00 ; // f i r s t two b y t e s in b u f f e r are always high and low b y t e<br />
a d r e s s from EEPROM memory<br />
b u f f e r [ 1 ] = 0 x00 ;<br />
s t a r t t r a n s a c t i o n = 0 ;<br />
}<br />
55 while ( ! ( EP2468STAT & bmEP2EMPTY) ) // check EP2 EMPTY( busy ) b i t in EP2468STAT (SFR) ,<br />
core s e t ’ s t h i s b i t when FIFO i s empty<br />
{<br />
// Autopointer source a d r e s s<br />
AUTOPTRH1 = MSB( &EP2FIFOBUF ) ;<br />
AUTOPTRL1 = LSB( &EP2FIFOBUF ) ;<br />
60<br />
count = (EP2BCH 64) {<br />
70 loop = 6 4 ; // t h e page w r i t e o f EEPROM may not be l o n g e r than 64<br />
b y t e s<br />
count −= 6 4 ; // t h e t o t a l b y t e s in t h e FIFO minus 64 b y t e s<br />
} else {<br />
Project Report 75
E. Quellcode<br />
loop = count ; // i f t h e end o f t r a n s a c t i o n t h e b y t e s in t h e FIFO<br />
counter i s > 8 ; // w r i t e h i g h b y t e o f memory<br />
a d r e s s<br />
b u f f e r [ 1 ] = eeprom address & 0xFF ; // w r i t e low b y t e o f memory a d r e s s<br />
}<br />
w r i t e s t a t e = w r i t e n o k ; // rearm w r i t e t r a n s a c t i o n<br />
90 SYNCDELAY;<br />
EP2BCL = 0 x80 ; // re (arm) EP2OUT<br />
SYNCDELAY;<br />
}<br />
}<br />
95<br />
void eeprom rd (WORD r e a d c o u n t ) // read count i s t h e number o f b y t e s to read<br />
t h a t have to send t h e Host with t h e c o r r e s p o n d e t<br />
{ // vendor r e q u e s t<br />
WORD count , i , temp=0;<br />
100 switch ( e e p r o m r e a d s t a t e )<br />
{<br />
case i n i t :<br />
{<br />
b u f f e r [ 0 ] = 0 x00 ; // f i r s t two b y t e s in b u f f e r are always high and low<br />
b y t e a d r e s s from EEPROM memory<br />
105 b u f f e r [ 1 ] = 0 x00 ;<br />
// Autopointer d e s t i n a t i o n a d r e s s<br />
AUTOPTRH2 = MSB( &EP4FIFOBUF ) ;<br />
AUTOPTRL2 = LSB( &EP4FIFOBUF ) ;<br />
110<br />
EZUSB WriteI2C ( c o n t r o l , 0x02 , &b u f f e r [ 0 ] ) ; // s e t w r i t e o p e r a t i o n and w r i t e<br />
t h e a d r e s s word<br />
EZUSB WaitForEEPROMWrite( c o n t r o l ) ; // wait t i l l EEPROM i s ready f o r next<br />
data<br />
count = r e a d c o u n t ; // s e t counter e q u a l number o f b y t e s to read<br />
e e p r o m r e a d s t a t e = read ; // s e t read s t a t e<br />
115 break ;<br />
}<br />
case read :<br />
{<br />
i f ( ! ( EP2468STAT & bmEP4FULL) ) { // check EP4 FULL( busy ) b i t in<br />
EP2468STAT (SFR) , core s e t ’ s t h i s b i t when FIFO i s f u l l<br />
120 // Autopointer source a d r e s s<br />
AUTOPTRH1 = MSB( &b u f f e r [ 0 ] ) ;<br />
AUTOPTRL1 = LSB( &b u f f e r [ 0 ] ) ;<br />
i f ( count > 64) {<br />
125 loop = 6 4 ; // b u f f e r array i s 64 b y t e s because page w r i t e<br />
l i m i t a t i o n o f EEPROM<br />
76 Matthias Zurbrügg, Christoph Zimmermann
E.1. Firmware<br />
count −= 6 4 ; // t h e t o t a l b y t e s in t h e b u f f e r array minus 64<br />
b y t e s<br />
} else {<br />
loop = count ; // i f t h e end o f t r a n s a c t i o n t h e b y t e s in t h e<br />
b u f f e r array are = r e a d c o u n t ) { // i f t h e number o f b y t e s w r i t t e n e q u a l<br />
number o f b y t e s to read<br />
bytecount = 0 ;<br />
140 e e p r o m r e a d s t a t e = ep4in arm ; // s e t EP4 rearm s t a t e<br />
}<br />
}<br />
break ;<br />
}<br />
145 case ep4in arm :<br />
{<br />
SYNCDELAY;<br />
EP4BCH = MSB( r e a d c o u n t ) ;<br />
SYNCDELAY;<br />
150 EP4BCL = LSB( r e a d c o u n t ) ; // arm EP4IN∗/<br />
SYNCDELAY;<br />
e e p r o m r e a d s t a t e = i d l e ; // s e t read s t a t e to i d l e<br />
}<br />
default :<br />
155 break ;<br />
}<br />
}<br />
E.1.5. SPI Flash schreiben und lesen<br />
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
2 ∗ Diplomwork :<br />
∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
∗<br />
∗ ( ‘ \ ( ) ( ) ( )<br />
∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
7 ∗ | < ’| ) | | School o f Engineering and<br />
∗ | ( ) ) | | | | | | Information Technology<br />
∗ ( / ’( ) ( ) ( )<br />
∗<br />
∗<br />
12 ∗ Author : Matthias Zurbrügg<br />
∗ Date o f c r e a t i o n : 30.10.2006<br />
∗ D e s c r i p t i o n :<br />
∗ Source code o f SPI Flash read / w r i t e f u n c t i o n s and t h e<br />
∗ a u t o c o n f i g u r a t i o n f u n c t i o n<br />
17 ∗<br />
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
#include ” fx2 . h”<br />
#include ” f x 2 r e g s . h”<br />
22 #include ” f x 2 s d l y . h” // SYNCDELAY macro<br />
Project Report 77
E. Quellcode<br />
#include ” s p i . h”<br />
#include ”m25p16 . h”<br />
#include ” i i c e x t c h i p c o m . h”<br />
27 #define w r i t e n o k 1 // d e f i n i t i o n f o r w r i t e s t a t e<br />
#define w r i t e o k 0 // d e f i n i t i o n f o r w r i t e s t a t e<br />
#define f i l e s i z e 130952 // f i l e s i z e f o r XC3S200 ( important : you must<br />
a d j u s t t h i s s i z e f o r o t h e r d e v i c e s )<br />
#define highaddr memory range 0 x01 // 1 stand f o r t h e high address range in t h e SPI<br />
Flash<br />
32 extern BOOL f l a s h r d e n ;<br />
extern BOOL new cfg ; // d e t e c t a new c o n f i g u r a t i o n<br />
extern unsigned long s p i f l a s h a d d r e s s ; // memory a d r e s s from SPI Flash<br />
BOOL w r i t e s t a t u s = 1 ; // s e t w r i t e s t a t e on not ok<br />
37 unsigned int o f f s e t ; // o f f s e t f o r w r i t e t r a n s a c t i o n<br />
// unsigned i n t r e a d s t a t u s ;<br />
void s p i f l a s h i n i t ( void )<br />
{<br />
42 // Set Port A s e t t i n g s f o r SPI Flash communication<br />
OEA |= 0 x01 ; // Port A b i t 0 output f o r SCLK<br />
OEA |= 0 x02 ; // Port A b i t 1 output f o r MOSI<br />
OEA &= 0xFB ; // Port A b i t 2 i n p u t f o r MISO<br />
OEA |= 0 x08 ; // Port A b i t 3 output f o r SPI CS F<br />
47 }<br />
void s p i f l a s h w r ( void )<br />
{<br />
WORD count , i ;<br />
52 i f ( s w i t c h r d ( ) == highaddr memory range )<br />
{<br />
l e d w r (0 x06 ) ;<br />
s p i f l a s h a d d r e s s = 0 x100000 ;<br />
}<br />
57 while ( ! ( EP2468STAT & bmEP2EMPTY) ) // check EP2 EMPTY( busy ) b i t in EP2468STAT (SFR) ,<br />
core s e t ’ s t h i s b i t when FIFO i s empty<br />
{<br />
// Autopointer source a d r e s s<br />
AUTOPTRH1 = MSB( &EP2FIFOBUF ) ;<br />
AUTOPTRL1 = LSB( &EP2FIFOBUF ) ;<br />
62<br />
count = (EP2BCH 256) // i f i n p u t d a t a l o n g e r than 257 Bytes<br />
{<br />
o f f s e t = count − 2 5 4 ; // we must c a l c u l a t e t h e o f f s e t<br />
// e . g . t h e EP2 FIFO c ontent ( count ) i s 280 b y t e s , t h e o f f s e t<br />
i s 26<br />
// and t h e for −l o op ( writePageProgram ( ) ) r e p e a t 254 times<br />
77 // two b y t e send t h e startPageProgramm ( ) and<br />
lastPageProgramm ( ) f u n c t i o n s<br />
} else<br />
{<br />
o f f s e t = 2 ; // i f i n p u t d a t a s h o r t e r , t h e o f f s e t i s two because we<br />
78 Matthias Zurbrügg, Christoph Zimmermann
E.1. Firmware<br />
// must l o o p t h e writePageProgram ( ) t w i c e fewer than<br />
82 // t h e v a l u e in count<br />
// t w i c e fewer because t h e startPageProgramm ( ) and<br />
lastPageProgramm ( )<br />
// send a l r e a d y one b y t e per f u n c t i o n<br />
}<br />
while ( w r i t e s t a t u s ) // w r i t e s t a t u s i s ok i f t h e FIFO b u f f e r c ontent i s<br />
send<br />
87 {<br />
startPageProgram ( s p i f l a s h a d d r e s s , EXTAUTODAT1) ; // s t a r t t h e communication<br />
with t h e SPI Flash and<br />
// w r i t e t h e f i r s t data b y t e from soucre a d r e s s to<br />
SPI Flash ( f u n c t i o n in m25p16 . c )<br />
for ( i = 0 x0000 ; i < ( count−o f f s e t ) ; i++ ) // countinue t h e page program<br />
sequenz and l o o p EP2OUT data to SPI Flash<br />
92 {<br />
writePageProgram (EXTAUTODAT1) ; // w r i t e data b y t e from soucre a d r e s s to<br />
SPI Flash ( f u n c t i o n in m25p16 . c )<br />
}<br />
lastPageProgram (EXTAUTODAT1) ; // w r i t e t h e l a s t data b y t e and c l o s e t h e<br />
communication with t h e SPI Flash ( f u n c t i o n in m25p16 . c )<br />
97 i f ( count > 256) { // i f t h e EP2 counter l o n g e r than 256 b y t e s than we<br />
have send now t h e maximum page programm<br />
count −= 2 5 6 ; // v a l u e o f 256 Bytes and must s u b t r a c t t h i s number<br />
from t h e EP2 c o n t e n t counter<br />
o f f s e t = 2 ; // and can s e t t h e o f f s e t to two because t h e EP2 FIFO<br />
b u f f e r have now at t h e most once more 256 Bytes<br />
// hence we must l o op t h e writePageProgram ( ) in maximum 254<br />
times<br />
// e . g . t h e EP2 FIFO content ( count ) i s 280 b y t e s then 254<br />
b y t e s was send and 26 b y t e s are l e f t to send<br />
102 // t h u s t h e o f f s e t i s two and t h e for −l o o p<br />
( writePageProgram ( ) ) r e p e a t 24 times<br />
// two b y t e send t h e startPageProgramm ( ) and<br />
lastPageProgramm ( ) f u n c t i o n s<br />
} else<br />
{<br />
w r i t e s t a t u s = w r i t e o k ; // i f EP2 counter s h o r t e r than 257 b y t e s t h e<br />
EP2 c o n t e n t was send<br />
107 }<br />
s p i f l a s h a d d r e s s += 2 5 6 ; // s e t t h e next s t a r t a d r e s s f o r SPI Flase<br />
w r i t e f u n c t i o n startPageProgramm ( )<br />
}<br />
w r i t e s t a t u s = w r i t e n o k ; // r e s e t w r i t e s t a t e f o r next communication<br />
SYNCDELAY;<br />
112 EP2BCL = 0 x80 ; // re (arm) EP2OUT<br />
SYNCDELAY;<br />
}<br />
}<br />
117 void s p i f l a s h r d ( void )<br />
{<br />
WORD i ; // counter f o r read i n s t r u c t i o n<br />
i f ( ! ( EP2468STAT & bmEP4FULL) ) // check EP4 FULL( busy ) b i t in EP2468STAT (SFR) ,<br />
core s e t ’ s t h i s b i t when FIFO i s f u l l<br />
122 {<br />
// a u t o p o i n t e r d e s t i n a t i o n a d r e s s from EP4IN<br />
AUTOPTRH2 = MSB( &EP4FIFOBUF ) ;<br />
AUTOPTRL2 = LSB( &EP4FIFOBUF ) ;<br />
127 EXTAUTODAT2 = startBlockRead ( s p i f l a s h a d d r e s s ) ; // w r i t e data b y t e from SPI<br />
Flash to d e s t i n a t i o n a d r e s s<br />
Project Report 79
E. Quellcode<br />
132 }<br />
for ( i = 0 x0000 ; i < 5 1 0 ; i++ ) // l oop SPI Flash data to EP6IN<br />
{<br />
EXTAUTODAT2 = readBlock ( ) ; // w r i t e data b y t e from SPI Flash to<br />
d e s t i n a t i o n a d r e s s<br />
EXTAUTODAT2 = lastBlockRead ( ) ; // w r i t e data b y t e from SPI Flash to<br />
d e s t i n a t i o n a d r e s s<br />
SYNCDELAY;<br />
EP4BCH = 0 x02 ;<br />
137 SYNCDELAY;<br />
EP4BCL = 0 x00 ;<br />
s p i f l a s h a d d r e s s =0x200 ;<br />
}<br />
f l a s h r d e n = 0 ;<br />
142 }<br />
// arm EP6IN<br />
void b o o t l o a d c f g ( void )<br />
{<br />
BOOL busy ; // v a i a b l e f o r busy check<br />
147 WORD i ; // counter f o r s t a r t u p sequence<br />
unsigned long a d d r e s s = 0 , counter ; // s t a r t a d r e s s f o r read i n s t r u c t i o n , b y t e<br />
counter<br />
// Read t h e s w i t c h to d e t e c t in witch address range t h e c o n f i g u r a t i o n s h o u l d be<br />
w r i t t e n<br />
i f ( s w i t c h r d ( ) == highaddr memory range )<br />
{<br />
152 l e d w r (0 x06 ) ;<br />
a d d r e s s = 0 x100000 ;<br />
}<br />
GPIFIDLECTL &= 0xF9 ; // b r i n g CS B , RDWR B low<br />
157 PA5 = 0 ; // b r i n g Prog B low b r i n g s t h e d e v i c e in t h e i n i t a l i s a t i o n mode<br />
// and h o l d i t t h e r e<br />
PA5 = 1 ; // b r i n g Prog B b i t h i g h<br />
162 while (PA4 == 0) // i f I n i t B goes h i g h t h e d e v i c e i s in t h e c o n f i g u r a t i o n<br />
l o a d mode<br />
{<br />
;<br />
}<br />
167 IOB = startBlockRead ( a d d r e s s ) ; // d r i v e Port B with f i r s t data b y t e<br />
GPIFIDLECTL &= 0xFE ; // b r i n g CCLK low<br />
GPIFIDLECTL |= 0 x01 ; // b r i n g CCLK h i g h<br />
172 for ( counter = 0 ; counter < ( f i l e s i z e −2) ; counter++)<br />
{<br />
IOB = readBlock ( ) ; // d r i v e Port B with data b y t e<br />
GPIFIDLECTL &= 0xFE ; // b r i n g CCLK low<br />
177 GPIFIDLECTL |= 0 x01 ; // b r i n g CCLK h i g h<br />
// check f o r busy<br />
do<br />
{<br />
182 busy = PA7 ; // read busy b i t<br />
i f ( busy == TRUE)<br />
{<br />
GPIFIDLECTL &= 0xFE ; // b r i n g CCLK low<br />
GPIFIDLECTL |= 0 x01 ; // b r i n g CCLK h i g h<br />
187 }<br />
i f (PA7 == TRUE) // i f DONE i s set , a b o r t t h e busy check because a f t e r<br />
{ // c o n f i g u r a t i o n i s complete t h e DONE b i t has a undefined v a l u e<br />
80 Matthias Zurbrügg, Christoph Zimmermann
E.1. Firmware<br />
busy = FALSE ;<br />
}<br />
192 } while ( busy == TRUE) ;<br />
}<br />
IOB = lastBlockRead ( ) ; // d r i v e Port B with l a s t data b y t e<br />
197 GPIFIDLECTL &= 0xFE ; // b r i n g CCLK low<br />
GPIFIDLECTL |= 0 x01 ; // b r i n g CCLK h i g h<br />
GPIFIDLECTL |= 0 x06 ; // b r i n g CS B , RDWR B h i g h<br />
202 for ( i =0; i
E. Quellcode<br />
43 S P I s e l e c t D e v i c e (M25P16) ;<br />
SPIwriteByte (RDSR) ;<br />
i f ( SPIreadByte ( )&&0x01==1){<br />
value=TRUE;<br />
}<br />
48 S P I d e s e l e c t D e v i c e (M25P16) ;<br />
return value ;<br />
}<br />
// read one b y t e at t h e g i v e n a d r e s s<br />
53 byte readByte ( long a d r e s s ) {<br />
byte value ;<br />
S P I s e l e c t D e v i c e (M25P16) ;<br />
SPIwriteByte (READ) ;<br />
sendAdress ( a d r e s s ) ;<br />
58 value = SPIreadByte ( ) ;<br />
S P I d e s e l e c t D e v i c e (M25P16) ;<br />
return value ;<br />
}<br />
63 // s t a r t s a b l o c k read from t h e g i v e n a d r e s s<br />
byte startBlockRead ( long a d r e s s ) {<br />
S P I s e l e c t D e v i c e (M25P16) ;<br />
SPIwriteByte (READ) ;<br />
sendAdress ( a d r e s s ) ;<br />
68 return SPIreadByte ( ) ;<br />
}<br />
// reads t h e next b y t e ( s e q u e n t i a l readout )<br />
byte readBlock ( ) {<br />
73 return SPIreadByte ( ) ;<br />
}<br />
// reads t h e l a s t b y t e from a b l o c k and t e r m i n a t e s t h e b l o c k r e a d<br />
byte lastBlockRead ( ) {<br />
78 byte value ;<br />
value = SPIreadByte ( ) ;<br />
S P I d e s e l e c t D e v i c e (M25P16) ;<br />
return value ;<br />
}<br />
83<br />
// e n a b l e w r i t e a c c e s s<br />
void writeEnable ( ) {<br />
S P I s e l e c t D e v i c e (M25P16) ;<br />
SPIwriteByte (WREN) ;<br />
88 S P I d e s e l e c t D e v i c e (M25P16) ;<br />
}<br />
// e r a s e s t h e s e c t o r in wich t h e g i v e n a d r e s s i s<br />
void s e c t o r E r a s e ( long a d r e s s ) {<br />
93 writeEnable ( ) ;<br />
S P I s e l e c t D e v i c e (M25P16) ;<br />
SPIwriteByte (SE) ;<br />
sendAdress ( a d r e s s ) ;<br />
S P I d e s e l e c t D e v i c e (M25P16) ;<br />
98 while ( isBusy ( ) ) {<br />
}<br />
}<br />
// e r a s e s t h e whole f l a s h<br />
103 void bulkErase ( ) {<br />
writeEnable ( ) ;<br />
S P I s e l e c t D e v i c e (M25P16) ;<br />
SPIwriteByte (BE) ;<br />
S P I d e s e l e c t D e v i c e (M25P16) ;<br />
108 while ( isBusy ( ) ) {<br />
82 Matthias Zurbrügg, Christoph Zimmermann
E.1. Firmware<br />
}<br />
}<br />
// w r i t e s a 256 b y t e l o n g array to t h e a d r e s s e d page<br />
113 void pageProgram ( long adress , byte ∗ c o n t e n t a r r a y ) {<br />
int i =0;<br />
writeEnable ( ) ;<br />
S P I s e l e c t D e v i c e (M25P16) ;<br />
SPIwriteByte (PP) ;<br />
118 sendAdress ( a d r e s s ) ;<br />
for ( i =0; i > 1 6 ;<br />
SPIwriteByte ( sendByte ) ;<br />
sendByte = ( a d r e s s & 0x0000FF00 ) >> 8 ;<br />
153 SPIwriteByte ( sendByte ) ;<br />
sendByte = a d r e s s & 0x000000FF ;<br />
SPIwriteByte ( sendByte ) ;<br />
}<br />
E.1.7. SPI Kommunikation<br />
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
2 ∗ Diplomwork :<br />
∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
∗<br />
∗ ( ‘ \ ( ) ( ) ( )<br />
∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
7 ∗ | < ’| ) | | School o f Engineering and<br />
∗ | ( ) ) | | | | | | Information Technology<br />
∗ ( / ’( ) ( ) ( )<br />
∗<br />
∗<br />
12 ∗ Author : Christoph Zimmermann<br />
∗ Date o f c r e a t i o n : 30.10.2006<br />
Project Report 83
E. Quellcode<br />
∗ D e s c r i p t i o n :<br />
∗ Library to a c c e s s SPI Devices<br />
∗<br />
17 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
#include ” s p i . h”<br />
void S P I s e l e c t D e v i c e ( byte d e v i c e ) {<br />
22 switch ( d e v i c e ) {<br />
case 0 : DEVICE0 = 0 ;<br />
break ;<br />
// case 1 : DEVICE1 = 0 ;<br />
// break ;<br />
27 // case 2 : DEVICE2 = 0 ;<br />
// break ;<br />
default : break ;<br />
}<br />
}<br />
32<br />
void S P I d e s e l e c t D e v i c e ( byte d e v i c e ) {<br />
switch ( d e v i c e ) {<br />
case 0 : DEVICE0 = 1 ;<br />
break ;<br />
37 // case 1 : DEVICE1 = 1 ;<br />
// break ;<br />
// case 2 : DEVICE2 = 1 ;<br />
// break ;<br />
default : break ;<br />
42 }<br />
}<br />
void SPIwriteByte ( byte outputdata ) {<br />
byte i =8;<br />
47<br />
for ( i ; i >0; i −−){<br />
SCLK = 0 ;<br />
i f ( outputdata > 127) {<br />
MOSI = 1 ;<br />
52 }<br />
else {<br />
MOSI = 0 ;<br />
}<br />
SCLK = 1 ;<br />
57 outputdata = outputdata
E.1. Firmware<br />
SCLK = 0 ;<br />
82 return inputdata ;<br />
}<br />
E.1.8. Kommunikation zwischen Host und FPGA<br />
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
∗ Diplomwork :<br />
∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
∗<br />
5 ∗ ( ‘ \ ( ) ( ) ( )<br />
∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
∗ | < ’| ) | | School o f Engineering and<br />
∗ | ( ) ) | | | | | | Information Technology<br />
∗ ( / ’( ) ( ) ( )<br />
10 ∗<br />
∗<br />
∗ Author : Matthias Zurbrügg<br />
∗ Date o f c r e a t i o n : 16.11.2006<br />
∗ D e s c r i p t i o n :<br />
15 ∗ Source code o f read / w r i t e waveforms f u n c t i o n s<br />
∗<br />
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
#include ” fx2 . h”<br />
20 #include ” f x 2 r e g s . h”<br />
#include ” f x 2 s d l y . h”<br />
#define GPIFREAD 4 // read b i t in GPIFTRIG r e g i s t e r<br />
#define GPIF EP6 2 // EP6 b i t in GPIFTRIG r e g i s t e r<br />
25 #define GPIF EP8 3 // EP8 b i t in GPIFTRIG r e g i s t e r<br />
BYTE temp = 0 , i ; // temporary v a r i a b l e s f o r GPIF s t a t e machine break<br />
c o n d i t i o n<br />
s t a t i c WORD FIFOBC IN = 0 x0000 ; // v a r i a b l e t h a t c o n t a i n s EP6FIFOBCH/L v a l u e<br />
s t a t i c WORD xdata Tcount = 0 x01 ; // s e t t r a n s a c t i o n count to one f o r run t h e<br />
read waveform one times<br />
30<br />
void gpif wr waveform ( void )<br />
{<br />
i f ( GPIFTRIG & 0 x80 ) // i f GPIF i n t e r f a c e IDLE<br />
{<br />
35 EP6GPIFFLGSEL = 0 x01 ; // Set GPIF FIFO f l a g i f EP2 i s empty<br />
SYNCDELAY;<br />
GPIFTRIG = GPIF EP6 ; // launch GPIF FIFO WRITE Transaction from<br />
EP6 FIFO<br />
SYNCDELAY;<br />
40 do<br />
{<br />
temp=(IOE&0x07 ) ; // read GPIF debug pins PE[ 0 : 2 ] f o r l o o k i n g t h e<br />
c u r r e n t s t a t e ( show GSTAT in TRM)<br />
i f ( temp==(IOE&0x07 ) ) // i f GPIF in t h e same s t a t e<br />
{<br />
45 for ( i =0; i
E. Quellcode<br />
FIFORESET = 0 x80 ; // s e t NAKALL b i t to NAK a l l t r a n s f e r s from h o s t<br />
SYNCDELAY;<br />
55 FIFORESET = 0 x06 ; // r e s e t EP6 FIFO<br />
SYNCDELAY;<br />
FIFORESET = 0 x00 ; // c l e a r NAKALL b i t to resume normal o p e r a t i o n<br />
SYNCDELAY;<br />
}<br />
60 }<br />
}<br />
} while ( ! ( GPIFTRIG & 0 x80 ) ) ; // wait f o r DONE b i t from waveform<br />
SYNCDELAY;<br />
65 EP6BCL = 0 x00 ;<br />
SYNCDELAY;<br />
EP6BCL = 0 x80 ; // rearm EP2OUT<br />
SYNCDELAY;<br />
}<br />
70 }<br />
void g p i f r d w a v e f o r m ( void )<br />
{<br />
EP8GPIFFLGSEL = 0 x10 ; // s e t GPIF FIFO f l a g to f u l l<br />
75 i f ( GPIFTRIG & 0 x80 ) // i f GPIF i n t e r f a c e IDLE<br />
{<br />
i f ( ! ( EP2468STAT & bmEP8FULL ) ) // check EP8 FULL( busy ) b i t in EP2468STAT<br />
(SFR) , core s e t ’ s t h i s b i t when FIFO i s f u l l<br />
{<br />
GPIFTCB1 = MSB( Tcount ) ; // s e t u p t r a n s a c t i o n count with Tcount<br />
v a l u e<br />
80 SYNCDELAY;<br />
GPIFTCB0 = LSB( Tcount ) ;<br />
SYNCDELAY;<br />
GPIFTRIG = GPIFREAD | GPIF EP8 ; // launch GPIF FIFO READ Transaction to<br />
EP8IN ( p o l l i n g )<br />
85 SYNCDELAY;<br />
do<br />
{<br />
temp=(IOE&0x07 ) ; // read GPIF debug pins PE[ 0 : 2 ] f o r l o o k i n g t h e<br />
c u r r e n t s t a t e ( show GSTAT in TRM)<br />
i f ( temp==(IOE&0x07 ) ) // i f GPIF in t h e same s t a t e<br />
90 {<br />
for ( i =0; i
E.1. Firmware<br />
E.1.9. GPIF Waveform Source Code<br />
// This program c o n f i g u r e s t h e General Programmable I n t e r f a c e (GPIF) f o r FX2.<br />
// Please do not modify s e c t i o n s o f t e x t which are marked as ”DO NOT EDIT . . . ” .<br />
3 //<br />
// DO NOT EDIT . . .<br />
// GPIF I n i t i a l i z a t i o n<br />
// I n t e r f a c e Timing Sync<br />
// I n t e r n a l Ready I n i t IntRdy=1<br />
8 // CTL Out T r i s t a t e −a b l e Binary<br />
// S i n g l e W r i t e WF S e l e c t 3<br />
// SingleRead WF S e l e c t 2<br />
// FifoWrite WF S e l e c t 1<br />
// FifoRead WF S e l e c t 0<br />
13 // Data Bus I d l e Drive T r i s t a t e<br />
// END DO NOT EDIT<br />
// DO NOT EDIT . . .<br />
// GPIF Wave Names<br />
18 // Wave 0 = FIFORd<br />
// Wave 1 = FIFOWr<br />
// Wave 2 = SnglWr2<br />
// Wave 3 = SnglWr1<br />
23 // GPIF C t r l Outputs L e v e l<br />
// CTL 0 = WRU CMOS<br />
// CTL 1 = WRU CMOS<br />
// CTL 2 = RDYU CMOS<br />
// CTL 3 = unused CMOS<br />
28 // CTL 4 = unused CMOS<br />
// CTL 5 = unused CMOS<br />
// GPIF Rdy I n p u t s<br />
// RDY0 = WRX<br />
33 // RDY1 = RDYX<br />
// RDY2 = unused<br />
// RDY3 = unused<br />
// RDY4 = unused<br />
// RDY5 = TCXpire<br />
38 // FIFOFlag = FIFOFlag<br />
// IntReady = IntReady<br />
// END DO NOT EDIT<br />
// DO NOT EDIT . . .<br />
//<br />
43 // GPIF Waveform 0 : FIFORd<br />
//<br />
// I n t e r v a l 0 1 2 3 4 5 6<br />
I d l e (7)<br />
//<br />
//<br />
48 // AddrMode Same Val Same Val Same Val Same Val Same Val Same Val Same Val<br />
// DataMode NO Data NO Data NO Data A c t i v a t e NO Data NO Data NO Data<br />
// NextData SameData SameData SameData SameData NextData SameData SameData<br />
// I n t Trig No I n t No I n t No I n t No I n t No I n t No I n t No I n t<br />
// IF/Wait IF IF IF Wait 1 IF IF IF<br />
53 // Term A WRX FIFOFlag WRX WRX WRX RDYX<br />
// LFunc AND AND AND OR AND AND<br />
// Term B WRX FIFOFlag WRX RDYX WRX RDYX<br />
// Branch1 Then 1 Then 2 Then 2 Then 5 Then 1 Then 6<br />
// Branch0 Else 0 Else 1 Else 3 Else 4 Else 6 E l s e I d l e<br />
58 // Re−Exec No No No No No No<br />
// Sngl /CRC D e f a u l t D e f a u l t D e f a u l t D e f a u l t D e f a u l t D e f a u l t D e f a u l t<br />
// WRU 0 0 0 0 0 0 0<br />
0<br />
Project Report 87
E. Quellcode<br />
// WRU 0 0 0 0 0 0 0<br />
0<br />
// RDYU 0 0 1 1 0 0 1<br />
0<br />
63 // unused 0 0 0 0 0 0 0<br />
0<br />
// unused 0 0 0 0 0 0 0<br />
0<br />
// unused 0 0 0 0 0 0 0<br />
0<br />
//<br />
// END DO NOT EDIT<br />
68 // DO NOT EDIT . . .<br />
//<br />
// GPIF Waveform 1 : FIFOWr<br />
//<br />
// I n t e r v a l 0 1 2 3 4 5 6<br />
I d l e (7)<br />
73 //<br />
//<br />
// AddrMode Same Val Same Val Same Val Same Val Same Val Same Val Same Val<br />
// DataMode NO Data NO Data A c t i v a t e NO Data NO Data NO Data NO Data<br />
// NextData SameData SameData SameData NextData SameData SameData SameData<br />
78 // I n t Trig No I n t No I n t No I n t No I n t No I n t No I n t No I n t<br />
// IF/Wait IF IF Wait 1 IF IF IF Wait 1<br />
// Term A WRX RDYX FIFOFlag RDYX RDYX<br />
// LFunc OR AND AND AND AND<br />
// Term B RDYX RDYX FIFOFlag RDYX RDYX<br />
83 // Branch1 Then 0 Then 2 Then 4 Then 4 ThenIdle<br />
// Branch0 Else 1 Else 1 Else 0 Else 5 Else 5<br />
// Re−Exec No No No No No<br />
// Sngl /CRC D e f a u l t D e f a u l t D e f a u l t D e f a u l t D e f a u l t D e f a u l t D e f a u l t<br />
// WRU 0 0 0 0 0 0 0<br />
0<br />
88 // WRU 0 1 1 0 0 0 0<br />
0<br />
// RDYU 0 0 0 0 0 1 1<br />
0<br />
// unused 0 0 0 0 0 0 0<br />
0<br />
// unused 0 0 0 0 0 0 0<br />
0<br />
// unused 0 0 0 0 0 0 0<br />
0<br />
93 //<br />
// END DO NOT EDIT<br />
// DO NOT EDIT . . .<br />
//<br />
// GPIF Waveform 2 : SnglWr2<br />
98 //<br />
// I n t e r v a l 0 1 2 3 4 5 6<br />
I d l e (7)<br />
//<br />
//<br />
// AddrMode Same Val Same Val Same Val Same Val Same Val Same Val Same Val<br />
103 // DataMode NO Data NO Data NO Data NO Data NO Data NO Data NO Data<br />
// NextData SameData SameData SameData SameData SameData SameData SameData<br />
// I n t Trig No I n t No I n t No I n t No I n t No I n t No I n t No I n t<br />
// IF/Wait Wait 1 Wait 1 Wait 1 Wait 1 Wait 1 Wait 1 Wait 1<br />
// Term A<br />
108 // LFunc<br />
// Term B<br />
// Branch1<br />
// Branch0<br />
88 Matthias Zurbrügg, Christoph Zimmermann
E.1. Firmware<br />
// Re−Exec<br />
113 // Sngl /CRC D e f a u l t D e f a u l t D e f a u l t D e f a u l t D e f a u l t D e f a u l t D e f a u l t<br />
// WRU 0 0 0 0 0 0 0<br />
0<br />
// WRU 0 0 0 0 0 0 0<br />
0<br />
// RDYU 0 0 0 0 0 0 0<br />
0<br />
// unused 0 0 0 0 0 0 0<br />
0<br />
118 // unused 0 0 0 0 0 0 0<br />
0<br />
// unused 0 0 0 0 0 0 0<br />
0<br />
//<br />
// END DO NOT EDIT<br />
// DO NOT EDIT . . .<br />
123 //<br />
// GPIF Waveform 3 : SnglWr1<br />
//<br />
// I n t e r v a l 0 1 2 3 4 5 6<br />
I d l e (7)<br />
//<br />
128 //<br />
// AddrMode Same Val Same Val Same Val Same Val Same Val Same Val Same Val<br />
// DataMode NO Data NO Data NO Data NO Data NO Data NO Data NO Data<br />
// NextData SameData SameData SameData SameData SameData SameData SameData<br />
// I n t Trig No I n t No I n t No I n t No I n t No I n t No I n t No I n t<br />
133 // IF/Wait Wait 1 Wait 1 Wait 1 Wait 1 Wait 1 Wait 1 Wait 1<br />
// Term A<br />
// LFunc<br />
// Term B<br />
// Branch1<br />
138 // Branch0<br />
// Re−Exec<br />
// Sngl /CRC D e f a u l t D e f a u l t D e f a u l t D e f a u l t D e f a u l t D e f a u l t D e f a u l t<br />
// WRU 0 0 0 0 0 0 0<br />
0<br />
// WRU 0 0 0 0 0 0 0<br />
0<br />
143 // RDYU 0 0 0 0 0 0 0<br />
0<br />
// unused 0 0 0 0 0 0 0<br />
0<br />
// unused 0 0 0 0 0 0 0<br />
0<br />
// unused 0 0 0 0 0 0 0<br />
0<br />
//<br />
148 // END DO NOT EDIT<br />
// GPIF Program Code<br />
// DO NOT EDIT . . .<br />
153 #include ” fx2 . h”<br />
#include ” f x 2 r e g s . h”<br />
#include ” f x 2 s d l y . h” // SYNCDELAY macro<br />
// END DO NOT EDIT<br />
158 // DO NOT EDIT . . .<br />
const char xdata WaveData [ 1 2 8 ] =<br />
{<br />
// Wave 0<br />
/∗ LenBr ∗/ 0x08 , 0x11 , 0x13 , 0x01 , 0x2C , 0x0E , 0x37 ,<br />
0x07 ,<br />
Project Report 89
E. Quellcode<br />
163 /∗ Opcode∗/ 0x01 , 0x01 , 0x01 , 0x02 , 0x05 , 0x01 , 0x01 ,<br />
0x00 ,<br />
/∗ Output ∗/ 0x00 , 0x00 , 0x04 , 0x04 , 0x00 , 0x00 , 0x04 ,<br />
0x00 ,<br />
/∗ LFun ∗/ 0x00 , 0x36 , 0x00 , 0x00 , 0x41 , 0x00 , 0x09 ,<br />
0x3F ,<br />
// Wave 1<br />
/∗ LenBr ∗/ 0x01 , 0x11 , 0x01 , 0x20 , 0x25 , 0x3D , 0x01 ,<br />
0x07 ,<br />
168 /∗ Opcode∗/ 0x01 , 0x01 , 0x02 , 0x05 , 0x01 , 0x01 , 0x00 ,<br />
0x00 ,<br />
/∗ Output ∗/ 0x00 , 0x02 , 0x02 , 0x00 , 0x00 , 0x04 , 0x04 ,<br />
0x00 ,<br />
/∗ LFun ∗/ 0x41 , 0x09 , 0x00 , 0x36 , 0x09 , 0x09 , 0x00 ,<br />
0x3F ,<br />
// Wave 2<br />
/∗ LenBr ∗/ 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 ,<br />
0x07 ,<br />
173 /∗ Opcode∗/ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,<br />
0x00 ,<br />
/∗ Output ∗/ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,<br />
0x00 ,<br />
/∗ LFun ∗/ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,<br />
0x3F ,<br />
// Wave 3<br />
/∗ LenBr ∗/ 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 ,<br />
0x07 ,<br />
178 /∗ Opcode∗/ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,<br />
0x00 ,<br />
/∗ Output ∗/ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,<br />
0x00 ,<br />
/∗ LFun ∗/ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,<br />
0x3F ,<br />
} ;<br />
// END DO NOT EDIT<br />
183<br />
// DO NOT EDIT . . .<br />
const char xdata FlowStates [ 3 6 ] =<br />
{<br />
/∗ Wave 0 FlowStates ∗/ 0x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 ,<br />
188 /∗ Wave 1 FlowStates ∗/ 0x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 ,<br />
/∗ Wave 2 FlowStates ∗/ 0x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 ,<br />
/∗ Wave 3 FlowStates ∗/ 0x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 , 0 x00 ,<br />
} ;<br />
// END DO NOT EDIT<br />
193<br />
// DO NOT EDIT . . .<br />
const char xdata I n i t D a t a [ 7 ] =<br />
{<br />
/∗ Regs ∗/ 0xC0 , 0 x00 , 0 x00 , 0 x00 , 0 xEE, 0 xE4 , 0 x00<br />
198 } ;<br />
// END DO NOT EDIT<br />
// TO DO: You may add a d d i t i o n a l code below .<br />
203 void G p i f I n i t ( void )<br />
{<br />
BYTE i ;<br />
// R e g i s t e r s which r e q u i r e a s y n c h r o n i z a t i o n delay , see s e c t i o n 15.14<br />
208 // FIFORESET FIFOPINPOLAR<br />
// INPKTEND OUTPKTEND<br />
// EPxBCH: L REVCTL<br />
// GPIFTCB3 GPIFTCB2<br />
// GPIFTCB1 GPIFTCB0<br />
213 // EPxFIFOPFH: L EPxAUTOINLENH: L<br />
90 Matthias Zurbrügg, Christoph Zimmermann
E.1. Firmware<br />
// EPxFIFOCFG EPxGPIFFLGSEL<br />
// PINFLAGSxx EPxFIFOIRQ<br />
// EPxFIFOIE GPIFIRQ<br />
// GPIFIE GPIFADRH: L<br />
218 // UDMACRCH: L EPxGPIFTRIG<br />
// GPIFTRIG<br />
223<br />
// Note : The pre−REVE EPxGPIFTCH/L r e g i s t e r are a f f e c t e d , as w e l l . . .<br />
// . . . t h e s e have been r e p l a c e d by GPIFTC[ B3 : B0 ] r e g i s t e r s<br />
// 8051 doesn ’ t have a c c e s s to waveform memories ’ t i l<br />
// t h e p a r t i s in GPIF mode .<br />
IFCONFIG = 0xEE ;<br />
228 // IFCLKSRC=1 , FIFOs e x e c u t e s on i n t e r n a l c l k source<br />
// xMHz=1 , 48MHz i n t e r n a l c l k r a t e<br />
// IFCLKOE=0 , Don ’ t d r i v e IFCLK pin s i g n a l at 48MHz<br />
// IFCLKPOL=0 , Don ’ t i n v e r t IFCLK pin s i g n a l from i n t e r n a l c l k<br />
// ASYNC=1 , master samples asynchronous<br />
233 // GSTATE=1 , Drive GPIF s t a t e s out on PORTE[ 2 : 0 ] , debug WF<br />
// IFCFG[ 1 : 0 ] = 1 0 , FX2 in GPIF master mode<br />
GPIFABORT = 0xFF ; // a b o r t any waveforms pending<br />
238 GPIFREADYCFG = I n i t D a t a [ 0 ] ;<br />
GPIFCTLCFG = I n i t D a t a [ 1 ] ;<br />
GPIFIDLECS = I n i t D a t a [ 2 ] ;<br />
GPIFIDLECTL = I n i t D a t a [ 3 ] ;<br />
GPIFWFSELECT = I n i t D a t a [ 5 ] ;<br />
243 GPIFREADYSTAT = I n i t D a t a [ 6 ] ;<br />
// use dual a u t o p o i n t e r f e a t u r e . . .<br />
AUTOPTRSETUP = 0 x07 ; // inc both p o i n t e r s ,<br />
// . . . warning : t h i s i n t r o d u c e s pdata h o l e ( s )<br />
248 // . . . at E67B (XAUTODAT1) and E67C (XAUTODAT2)<br />
253<br />
// source<br />
AUTOPTRH1 = MSB( &WaveData ) ;<br />
AUTOPTRL1 = LSB( &WaveData ) ;<br />
// d e s t i n a t i o n<br />
AUTOPTRH2 = 0xE4 ;<br />
AUTOPTRL2 = 0 x00 ;<br />
258 // t r a n s f e r<br />
for ( i = 0 x00 ; i < 1 2 8 ; i++ )<br />
{<br />
EXTAUTODAT2 = EXTAUTODAT1;<br />
}<br />
263<br />
// Configure GPIF Address pins , output i n i t i a l value ,<br />
PORTCCFG = 0xFF ; // [ 7 : 0 ] as a l t . func . GPIFADR[ 7 : 0 ]<br />
OEC = 0xFF ; // and as o u t p u t s<br />
PORTECFG |= 0 x80 ; // [ 8 ] as a l t . func . GPIFADR[ 8 ]<br />
268 OEE |= 0 x80 ; // and as output<br />
// . . .OR. . . t r i −s t a t e GPIFADR[ 8 : 0 ] p i n s<br />
// PORTCCFG = 0x00 ; // [ 7 : 0 ] as p o r t I /O<br />
// OEC = 0 x00 ; // and as i n p u t s<br />
273 // PORTECFG &= 0x7F ; // [ 8 ] as p o r t I /O<br />
// OEE &= 0x7F ; // and as i n p u t<br />
// GPIF address p i n s update when GPIFADRH/L w r i t t e n<br />
SYNCDELAY; //<br />
278 GPIFADRH = 0 x00 ; // b i t s [ 7 : 1 ] always 0<br />
SYNCDELAY; //<br />
Project Report 91
E. Quellcode<br />
GPIFADRL = 0 x00 ; // p o i n t to PERIPHERAL address 0 x0000<br />
/∗ Configure GPIF FlowStates r e g i s t e r s f o r Wave 0 o f WaveData<br />
283 FLOWSTATE = FlowStates [ 0 ] ;<br />
FLOWLOGIC = FlowStates [ 1 ] ;<br />
FLOWEQ0CTL = FlowStates [ 2 ] ;<br />
FLOWEQ1CTL = FlowStates [ 3 ] ;<br />
FLOWHOLDOFF = FlowStates [ 4 ] ;<br />
288 FLOWSTB = FlowStates [ 5 ] ;<br />
FLOWSTBEDGE = FlowStates [ 6 ] ;<br />
FLOWSTBHPERIOD = FlowStates [ 7 ] ; ∗/<br />
}<br />
E.1.10. Headers<br />
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
∗ Diplomwork :<br />
3 ∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
∗<br />
∗ ( ‘ \ ( ) ( ) ( )<br />
∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
∗ | < ’| ) | | School o f Engineering and<br />
8 ∗ | ( ) ) | | | | | | Information Technology<br />
∗ ( / ’( ) ( ) ( )<br />
∗<br />
∗<br />
∗ Author : Matthias Zurbrügg<br />
13 ∗ Date o f c r e a t i o n : 08.11.2006<br />
∗ D e s c r i p t i o n :<br />
∗ Header with f u n c t i o n p r o t o t y p e o f EEPROM read / w r i t e<br />
∗<br />
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
18<br />
// EEPROM w r i t e f u n c t i o n<br />
void eeprom wr ( void ) ;<br />
// EEPROM read f u n c t i o n with number o f b y t e s to read<br />
23 void eeprom rd (WORD r e a d c o u n t ) ;<br />
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
2 ∗ Diplomwork :<br />
∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
∗<br />
∗ ( ‘ \ ( ) ( ) ( )<br />
∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
7 ∗ | < ’| ) | | School o f Engineering and<br />
∗ | ( ) ) | | | | | | Information Technology<br />
∗ ( / ’( ) ( ) ( )<br />
∗<br />
∗<br />
12 ∗ Author : Matthias Zurbrügg<br />
∗ Date o f c r e a t i o n : 16.11.2006<br />
∗ D e s c r i p t i o n :<br />
∗ Header with f u n c t i o n p r o t o t y p e s o f read / w r i t e waveforms<br />
∗<br />
17 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
// GPIF w r i t e waveform f o r Host to FPGA communication<br />
void gpif wr waveform ( void ) ;<br />
22 // GPIF read waveform f o r FPGA to Host communication<br />
void g p i f r d w a v e f o r m ( void ) ;<br />
92 Matthias Zurbrügg, Christoph Zimmermann
E.1. Firmware<br />
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
2 ∗ Diplomwork :<br />
∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
∗<br />
∗ ( ‘ \ ( ) ( ) ( )<br />
∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
7 ∗ | < ’| ) | | School o f Engineering and<br />
∗ | ( ) ) | | | | | | Information Technology<br />
∗ ( / ’( ) ( ) ( )<br />
∗<br />
∗<br />
12 ∗ Author : Christoph Zimmermann<br />
∗ Date o f c r e a t i o n : 30.10.2006<br />
∗ D e s c r i p t i o n :<br />
∗ H e a d e r f i l e to use t h e SPI l i b r a r y<br />
∗<br />
17 ∗ Changelog :<br />
∗ 30.10.2006<br />
∗ f i r s t v e r s i o n<br />
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
22 #include ” fx2 . h”<br />
#include ” f x 2 r e g s . h”<br />
#define MOSI PA1<br />
#define MISO PA2<br />
27 #define SCLK PA0<br />
#define DEVICE0 PA3<br />
//#d e f i n e DEVICE1<br />
//#d e f i n e DEVICE2<br />
//#d e f i n e DEVICE3<br />
32<br />
typedef unsigned char byte ;<br />
void S P I s e l e c t D e v i c e ( byte d e v i c e ) ;<br />
37 void S P I d e s e l e c t D e v i c e ( byte d e v i c e ) ;<br />
void SPIwriteByte ( byte outputdata ) ;<br />
byte SPIreadByte ( void ) ;<br />
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
∗ Diplomwork :<br />
∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
4 ∗<br />
∗ ( ‘ \ ( ) ( ) ( )<br />
∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
∗ | < ’| ) | | School o f Engineering and<br />
∗ | ( ) ) | | | | | | Information Technology<br />
9 ∗ ( / ’( ) ( ) ( )<br />
∗<br />
∗<br />
∗ Author : Matthias Zurbrügg<br />
∗ Date o f c r e a t i o n : 31.10.2006<br />
14 ∗ D e s c r i p t i o n :<br />
∗ Header with f u n c t i o n p r o t o t y p e o f FPGA c o n f i g u r a t i o n from Host over USB<br />
∗<br />
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
19 // i n i t i a l i s a t i o n f o r FPGA c o n f i g u r a t i o n<br />
void f p g a c f g i n i t ( void ) ;<br />
// f u n c t i o n t h a t c o n f i g u r e t h e FPGA<br />
void f p g a c f g ( void ) ;<br />
Project Report 93
E. Quellcode<br />
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
2 ∗ Diplomwork :<br />
∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
∗<br />
∗ ( ‘ \ ( ) ( ) ( )<br />
∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
7 ∗ | < ’| ) | | School o f Engineering and<br />
∗ | ( ) ) | | | | | | Information Technology<br />
∗ ( / ’( ) ( ) ( )<br />
∗<br />
∗<br />
12 ∗ Author : Christoph Zimmermann<br />
∗ Date o f c r e a t i o n : 31.10.2006<br />
∗ D e s c r i p t i o n :<br />
∗ H e a d e r f i l e f o r t h e M25P16 Library<br />
∗ Library to a c c e s s t h e M25P16 SPI Flash from ST<br />
17 ∗ M i c r o e l e c t r o n i c s . The S25FL016 SPI Flash from<br />
∗ Spansion i s s o f t w a r e and pin c o m p a t i b l e<br />
∗<br />
∗ Changelog :<br />
∗ 31.10.2006<br />
22 ∗ f i r s t v e r s i o n<br />
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
// d e f i n e s wich d e v i c e in t h e SPI subsytem i s t h e M25P16<br />
#define M25P16 0<br />
27 #define MANUFACTURER 0 x20<br />
#define MEMTYPE 0 x20<br />
#define MEMCAPACITY 0 x15<br />
#define MAXADRESS 0x1FFFFF<br />
32<br />
// f l a s h memory opcodes<br />
#define WREN 0 x06<br />
#define WRDI 0 x04<br />
#define RDID 0x9F<br />
37 #define RDSR 0 x05<br />
#define WRSR 0 x01<br />
#define READ 0 x03<br />
#define FAST READ 0x0B<br />
#define PP 0 x02<br />
42 #define SE 0xD8<br />
#define BE 0xC7<br />
#define DP 0xB9<br />
#define RES 0xAB<br />
47 // checks i f t h e c o r r e c t d e v i c e i s s e l e c t e d<br />
b i t isM25P16 ( ) ;<br />
52<br />
// checks i f t h e d e v i c e i s busy or ready to r e c e i v e t h e next i n s t r u c t i o n<br />
b i t isBusy ( ) ;<br />
// h e l p e r f u n c t i o n to send a d r e s s e s to t h e f l a s h<br />
void sendAdress ( long a d r e s s ) ;<br />
// e n a b l e w r i t e a c c e s s<br />
57 void writeEnable ( ) ;<br />
// read one b y t e at t h e g i v e n a d r e s s<br />
byte readByte ( long a d r e s s ) ;<br />
62 // s t a r t s a b l o c k read from t h e g i v e n a d r e s s<br />
byte startBlockRead ( long a d r e s s ) ;<br />
// reads t h e next b y t e ( s e q u e n t i a l readout )<br />
byte readBlock ( ) ;<br />
94 Matthias Zurbrügg, Christoph Zimmermann
E.2. Loopback Core<br />
67<br />
// reads t h e l a s t b y t e from a b l o c k and t e r m i n a t e s t h e b l o c k r e a d<br />
byte lastBlockRead ( ) ;<br />
// e r a s e s t h e s e c t o r in wich t h e g i v e n a d r e s s i s<br />
72 void s e c t o r E r a s e ( long a d r e s s ) ;<br />
// e r a s e s t h e whole f l a s h<br />
void bulkErase ( ) ;<br />
77 // w r i t e s a 256 b y t e l o n g array to t h e a d r e s s e d page<br />
void pageProgram ( long adress , byte ∗ c o n t e n t a r r a y ) ;<br />
82<br />
// page program f u n t i o n s to f i l l t h e page i t e r a t i v e<br />
void startPageProgram ( long adress , byte content ) ;<br />
void writePageProgram ( byte content ) ;<br />
void lastPageProgram ( byte content ) ;<br />
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
∗ Diplomwork :<br />
∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
∗<br />
5 ∗ ( ‘ \ ( ) ( ) ( )<br />
∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
∗ | < ’| ) | | School o f Engineering and<br />
∗ | ( ) ) | | | | | | Information Technology<br />
∗ ( / ’( ) ( ) ( )<br />
10 ∗<br />
∗<br />
∗ Author : Matthias Zurbrügg<br />
∗ Date o f c r e a t i o n : 30.10.2006<br />
∗ D e s c r i p t i o n :<br />
15 ∗ Header with f u n c t i o n p r o t o t y p e s o f SPI Flash read / w r i t e and t h e<br />
∗ a u t o c o n f i g u r a t i o n<br />
∗<br />
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
20 // i n i t i a l i s a t i o n f o r SPI Flash communication<br />
void s p i f l a s h i n i t ( void ) ;<br />
25<br />
// SPI Flash w r i t e f u n c t i o n<br />
void s p i f l a s h w r ( void ) ;<br />
// SPI Flash read f u n c t i o n<br />
void s p i f l a s h r d ( void ) ;<br />
// Booload f u n c t i o n t h a t c o n f i g u r e t h e FPGA from SPI Flash<br />
30 void b o o t l o a d c f g ( void ) ;<br />
E.2. Loopback Core<br />
E.2.1. Top<br />
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
−− Diplomwork :<br />
−− <strong>Gecko3</strong> SoC HW/SW Development Board<br />
−−<br />
5 −− ( ‘ \ ( ) ( ) ( )<br />
−− | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
−− | < ’| ) | | School o f Engineering and<br />
Project Report 95
E. Quellcode<br />
−− | ( ) ) | | | | | | Information Technology<br />
−− ( / ’( ) ( ) ( )<br />
10 −−<br />
−−<br />
−− Author : Christoph Zimmermann<br />
−− Date o f c r e a t i o n : 8.11.2006<br />
−− D e s c r i p t i o n :<br />
15 −− FPGA Module to t e s t t h e communication between t h e EZ−USB and t h e FPGA.<br />
−− The EZ−USB sends data (16 b i t wide ) to t h e FPGA. t he y are s t o r e d and when<br />
−− t h e s e l e c t e d number o f data ( s e l e c t e d by t h e s w i t c h e s ) i s reached t h e FPGA<br />
−− s t a r t s to send back t h e data to t h e EZ−USB in r e v e r s e d order (FILO)<br />
−−<br />
20 −− Target Devices : X i l i n x Spartan3 FPGA’ s ( usage o f BlockRam in t h e Datapath )<br />
−− Tool v e r s i o n s : 8.2 i<br />
−− Dependencies :<br />
−−<br />
−−<br />
25 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
library IEEE ;<br />
use IEEE . STD LOGIC 1164 .ALL;<br />
use IEEE . STD LOGIC ARITH .ALL;<br />
30 use IEEE . STD LOGIC UNSIGNED .ALL;<br />
−−−− Uncomment t h e f o l l o w i n g l i b r a r y d e c l a r a t i o n i f i n s t a n t i a t i n g<br />
−−−− any X i l i n x p r i m i t i v e s in t h i s code .<br />
library UNISIM ;<br />
35 use UNISIM . VComponents . a l l ;<br />
entity loopback i s<br />
port (<br />
DATA: inout s t d l o g i c v e c t o r (15 downto 0) ;<br />
40 CLK, RESET, WRU, RDYU: in s t d l o g i c ; −−r e s e t b u t t o n on development board i s 1<br />
when p r e s s e d<br />
WRX, RDYX, PW: out s t d l o g i c<br />
) ;<br />
end loopback ;<br />
45 architecture B e h a v i o r a l of loopback i s<br />
signal up , down , zero , writeEN , we : s t d l o g i c ;<br />
signal WRUint , RDYUint : s t d l o g i c ;<br />
50 component STM<br />
PORT (<br />
CLK, RDYU, RESET, WRU, z e r o : IN s t d l o g i c ;<br />
down , RDYX, up , we , writeEN , WRX : OUT s t d l o g i c<br />
) ;<br />
55 end component ;<br />
component datapath<br />
port (<br />
clk , r e s e t , we , up , down , writeEN : IN s t d l o g i c ;<br />
60 z e r o : OUT s t d l o g i c ;<br />
data : inout s t d l o g i c v e c t o r (15 downto 0)<br />
) ;<br />
end component ;<br />
65 begin<br />
PW
E.2. Loopback Core<br />
WRUint WRX, RDYU => RDYUint , RDYX =><br />
RDYX,<br />
z e r o => zero , writeEN => writeEN , we => we , up => up , down => down<br />
) ;<br />
i d a t a p a t h : datapath<br />
port map(<br />
90 c l k => CLK, r e s e t => RESET, z e r o => zero , we => we , up => up , down => down ,<br />
writeEN => writeEN , data => DATA<br />
) ;<br />
end B e h a v i o r a l ;<br />
E.2.2. Datenpfad<br />
1 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
−− Diplomwork :<br />
−− <strong>Gecko3</strong> SoC HW/SW Development Board<br />
−−<br />
−− ( ‘ \ ( ) ( ) ( )<br />
6 −− | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
−− | < ’| ) | | School o f Engineering and<br />
−− | ( ) ) | | | | | | Information Technology<br />
−− ( / ’( ) ( ) ( )<br />
−−<br />
11 −−<br />
−− Author : Christoph Zimmermann<br />
−− Date o f c r e a t i o n : 8.11.2006<br />
−− D e s c r i p t i o n :<br />
−− Datapath f o r t h e l o o p b a c k module<br />
16 −−<br />
−− Target Devices : X i l i n x Spartan3 FPGA’ s ( usage o f BlockRam in t h e Datapath )<br />
−− Tool v e r s i o n s : 8.2 i<br />
−− Dependencies :<br />
−−<br />
21 −−<br />
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
library IEEE ;<br />
use IEEE . STD LOGIC 1164 .ALL;<br />
26 use IEEE . STD LOGIC ARITH .ALL;<br />
use IEEE . STD LOGIC UNSIGNED .ALL;<br />
−−−− Uncomment t h e f o l l o w i n g l i b r a r y d e c l a r a t i o n i f i n s t a n t i a t i n g<br />
−−−− any X i l i n x p r i m i t i v e s in t h i s code .<br />
31 library UNISIM ;<br />
use UNISIM . VComponents . a l l ;<br />
entity datapath i s<br />
port (<br />
36 clk , r e s e t , we , up , down , writeEN : IN s t d l o g i c ;<br />
z e r o : OUT s t d l o g i c ;<br />
data : inout s t d l o g i c v e c t o r (15 downto 0)<br />
Project Report 97
E. Quellcode<br />
) ;<br />
41 end datapath ;<br />
architecture B e h a v i o r a l of datapath i s<br />
signal NOT writeEN : s t d l o g i c ;<br />
46 signal ADDR: s t d l o g i c v e c t o r (8 downto 0) ;<br />
signal t r a s h : s t d l o g i c v e c t o r (15 downto 0) ;<br />
signal trashp : s t d l o g i c v e c t o r (3 downto 0) ;<br />
signal DI : s t d l o g i c v e c t o r (15 downto 0) ;<br />
signal DO: s t d l o g i c v e c t o r (15 downto 0) ;<br />
51<br />
begin<br />
NOT writeEN X” 000000000 ” , −− Ouput v a l u e upon SSR a s s e r t i o n<br />
66 WRITE MODE => ”WRITE FIRST” −− WRITE FIRST, READ FIRST or NO CHANGE<br />
)<br />
port map (<br />
DO(31 downto 16) => trash , −− 32− b i t Data Output<br />
DO(15 downto 0) => DO,<br />
71 DOP => trashp , −− 4− b i t p a r i t y Output<br />
ADDR => ADDR, −− 9− b i t Address Input<br />
CLK => clk , −− Clock<br />
DI (31 downto 16) => ” 0000000000000000 ” , −− 32− b i t Data Input<br />
DI (15 downto 0) => DI ,<br />
76 −− DI(15 downto 0) => DATA,<br />
DIP => ” 0000 ” , −− 4− b i t p a r i t y Input<br />
EN => ’ 1 ’ , −− RAM Enable Input<br />
SSR => ’ 0 ’ , −− Synchronous Set / Reset Input<br />
WE => we −− Write Enable Input<br />
81 ) ;<br />
−− End o f RAMB16 S36 inst i n s t a n t i a t i o n<br />
IOBUFFER:<br />
86 for i in 15 downto 0 generate<br />
begin<br />
iod : IOBUF<br />
port map (<br />
I => DO( i ) ,<br />
91 ) ;<br />
end generate ;<br />
process ( clk , r e s e t )<br />
begin<br />
96 i f r e s e t = ’1 ’ then<br />
ADDR ’0 ’) ;<br />
e l s i f c l k = ’1 ’ and clk ’ event then<br />
i f up= ’1 ’ then<br />
ADDR DI ( i ) , T => NOT writeEN<br />
98 Matthias Zurbrügg, Christoph Zimmermann
E.2. Loopback Core<br />
106<br />
end i f ;<br />
end i f ;<br />
end process ;<br />
end B e h a v i o r a l ;<br />
E.2.3. Statemachine<br />
−− C: \DOCUMENTS AND SETTINGS\ZIMMC5\GECKO3 LOOPBACK\STM. vhd<br />
2 −− VHDL code c r e a t e d by Xilinx ’ s StateCAD 8.2 i<br />
−− Fri Dec 08 1 0 : 4 9 : 1 1 2006<br />
−− This VHDL code ( f o r use with X i l i n x XST) was generated using :<br />
−− enumerated s t a t e assignment with s t r u c t u r e d code format .<br />
7 −− Minimization i s enabled , i m p l i e d e l s e i s enabled ,<br />
−− and o u t p u t s are speed o p t i m i z e d .<br />
LIBRARY i e e e ;<br />
USE i e e e . s t d l o g i c 1 1 6 4 . a l l ;<br />
12<br />
ENTITY STM IS<br />
PORT (CLK,RDYU,RESET,WRU, z e r o : IN s t d l o g i c ;<br />
down ,RDYX, up , we , writeEN ,WRX : OUT s t d l o g i c ) ;<br />
END;<br />
17<br />
ARCHITECTURE BEHAVIOR OF STM IS<br />
TYPE t y p e s r e g IS (ADRESS UP,CHECK END,CHECK WRU,END PACKET,GET REQUEST, IDLE<br />
,PKTEND,SAVE DATA,SEND DATA,SEND REQUEST,VALID DATA,WAIT END) ;<br />
SIGNAL sreg , n e x t s r e g : t y p e s r e g ;<br />
22 SIGNAL next down , next RDYX , next up , next we , next writeEN , next WRX :<br />
s t d l o g i c ;<br />
BEGIN<br />
PROCESS (CLK, RESET, n e x t s r e g , next down , next RDYX , next up , next we ,<br />
next writeEN , next WRX)<br />
27 BEGIN<br />
IF ( RESET= ’1 ’ ) THEN<br />
s r e g
E. Quellcode<br />
57 next writeEN
E.2. Loopback Core<br />
next up
E. Quellcode<br />
next RDYX<br />
n e x t s r e g
E.3. Hostsoftware<br />
END BEHAVIOR;<br />
E.3. Hostsoftware<br />
E.3.1. Klasse QGecko<br />
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
∗ Diplomwork :<br />
∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
∗<br />
5 ∗ ( ‘ \ ( ) ( ) ( )<br />
∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
∗ | < ’| ) | | School o f Engineering and<br />
∗ | ( ) ) | | | | | | Information Technology<br />
∗ ( / ’( ) ( ) ( )<br />
10 ∗<br />
∗<br />
∗ Author : Christoph Zimmermann<br />
∗ Date o f c r e a t i o n : 4.12.2006<br />
∗ D e s c r i p t i o n :<br />
15 ∗ Gecko 3 c l a s s h e a d e r f i l e<br />
∗ a l l hardware r e l a t e d f u n c t i o n s are in t h i s c l a s s to g e t an<br />
∗ easy a c c e s s to t h e gecko f u n c t i o n s<br />
∗<br />
∗ Changelog :<br />
20 ∗ 4.12.2006<br />
∗ f i r s t v e r s i o n<br />
∗<br />
∗ 5.12.2006<br />
∗ t e s t i n g and b u g f i x e s<br />
25 ∗<br />
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
#ifndef GECKO H<br />
#define GECKO H<br />
30<br />
#include <br />
#include <br />
#include <br />
#include <br />
35<br />
#include <br />
// vendor and product i d o f t h e gecko board :<br />
#define ID VENDOR GECKO3 0X0547<br />
40 #define ID PRODUCT GECKO3 0X8888<br />
// r e q u i r e d information about t h e i n t e r f a c e s and a s s o c i a t e d e n d p o i n t s<br />
#define GECKO COM INTERFACE 0<br />
#define GECKO COM EP READ 8<br />
45 #define GECKO COM EP WRITE 6<br />
#define GECKO ADM INTERFACE 1<br />
#define GECKO ADM EP READ 4<br />
#define GECKO ADM EP WRITE 2<br />
50<br />
//number o f c o n f i g u r a t i o n s s t o r a b l e in t h e s p i f l a s h<br />
#define GECKO MAX CONFIGS 2<br />
// t h e d e f i n e d v e n d o r r e q u e s t s o f t h e gecko<br />
55 #define GECKO SEND FW 0xC2<br />
#define GECKO GET FW 0xC3<br />
#define GECKO SEND CONFIGURATION 0xC4<br />
Project Report 103
E. Quellcode<br />
#define GECKO GET CONFIGURATION 0xC5<br />
#define GECKO SEND END 0xC6<br />
60 #define GECKO CONFIGURE FPGA 0xC1<br />
#define GECKO CONFIGURE DONE 0xB2<br />
#define GECKO FW VERSION 0xB1<br />
class QGecko : public QObject<br />
65 {<br />
Q OBJECT<br />
public :<br />
QGecko ( QObject ∗ parent = 0) ;<br />
70 ˜QGecko ( ) ;<br />
bool open ( ) ;<br />
bool c l o s e ( ) ;<br />
bool read ( QByteArray ∗ readData , int byteCount ) ;<br />
75 bool w r i t e ( QFile &data ) ;<br />
bool w r i t e ( QByteArray data ) ;<br />
bool admOpen ( ) ;<br />
bool admClose ( ) ;<br />
bool admConfigure ( QFile &configData ) ;<br />
80 bool admDownload ( QFile &configData , int p l a c e ) ;<br />
bool admFirmware ( QFile &configData ) ;<br />
bool admGetFwVersion ( QString ∗ v e r s i o n ) ;<br />
85<br />
protected :<br />
private s l o t s :<br />
bool admWrite ( QFile &data ) ;<br />
private :<br />
90 u s b d e v h a ndle ∗geckoCom ; // d e v i c e handler f o r t h e communication i n t e r f a c e<br />
u sb d e v h a ndle ∗geckoAdm ; // d e v i c e handler f o r t h e a d m i n i s t r a t i o n i n t e r f a c e<br />
} ;<br />
#endif<br />
1 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
∗ Diplomwork :<br />
∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
∗<br />
∗ ( ‘ \ ( ) ( ) ( )<br />
6 ∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
∗ | < ’| ) | | School o f Engineering and<br />
∗ | ( ) ) | | | | | | Information Technology<br />
∗ ( / ’( ) ( ) ( )<br />
∗<br />
11 ∗<br />
∗ Author : Christoph Zimmermann<br />
∗ Date o f c r e a t i o n : 4.12.2006<br />
∗ D e s c r i p t i o n :<br />
∗ Gecko 3 c l a s s<br />
16 ∗ a l l hardware r e l a t e d f u n c t i o n s are in t h i s c l a s s to g e t an<br />
∗ easy a c c e s s to t h e gecko f u n c t i o n s<br />
∗<br />
∗ Changelog :<br />
∗ 4.12.2006<br />
21 ∗ f i r s t v e r s i o n<br />
∗<br />
∗ 5.12.2006<br />
∗ t e s t i n g and b u g f i x e s<br />
∗<br />
26 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
#include ” gecko . h”<br />
104 Matthias Zurbrügg, Christoph Zimmermann
E.3. Hostsoftware<br />
#include <br />
31<br />
QGecko : : QGecko ( QObject ∗ parent )<br />
: QObject ( parent )<br />
{<br />
u s b i n i t ( ) ; // i n i t i a l i s i z e t h e l i b u s b<br />
36 geckoAdm = 0 ;<br />
geckoCom = 0 ;<br />
}<br />
41 QGecko : : ˜ QGecko ( )<br />
{<br />
}<br />
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
46 // f u n c t i o n s f o r normal communication with t h e gecko board<br />
bool QGecko : : open ( ) {<br />
struct usb bus ∗ b u s s e s ;<br />
u s b f i n d b u s s e s ( ) ;<br />
51 u s b f i n d d e v i c e s ( ) ; // rescan a l l usb t h i n g s<br />
b u s s e s = u s b g e t b u s s e s ( ) ; // r e t u r n s t h e l i s t o f a l l usb b u s s e s<br />
56<br />
struct usb bus ∗ bus ;<br />
for ( bus = b u s s e s ; bus ; bus = bus−>next ) {<br />
struct u s b d e v i c e ∗ dev ;<br />
for ( dev = bus−>d e v i c e s ; dev ; dev = dev−>next ) { // go through a l l b u s s e s and<br />
a l l d e v i c e s and check i f i t i s a gecko<br />
61 i f ( dev−>d e s c r i p t o r . idVendor == ID VENDOR GECKO3) {<br />
i f ( dev−>d e s c r i p t o r . idProduct == ID PRODUCT GECKO3) {<br />
geckoCom = usb open ( dev ) ; //we found a gecko , now we open t h e d e v i c e<br />
char dr name [ 1 0 0 ] ;<br />
int np = u s b g e t d r i v e r n p ( geckoCom , 0 , dr name , 100) ; // checks i f t h e r e<br />
i s a k e r n e l d r i v e r loaded f o r t h i s d e v i c e<br />
66 i f ( np==0) {<br />
u s b d e t a c h k e r n e l d r i v e r n p ( geckoCom , 0) ; // unloads t h e k e r n e l d r i v e r<br />
i f t h e r e i s one . e l s e t h e d e v i c e i s not a v i a b l e f o r us<br />
}<br />
int t = u s b c l a i m i n t e r f a c e ( geckoCom , GECKO COM INTERFACE) ; // bound t h e<br />
i n t e r f a c e from t h e os . now we can use t h i s i n t e r f a c e<br />
i f ( t == 0) {<br />
71 return true ; //end o f s e a r c h i n g f o r d e v i c e s . t h e f i r s t found<br />
d e v i c e i s used<br />
}<br />
else {<br />
return f a l s e ;<br />
}<br />
76 }<br />
}<br />
}<br />
}<br />
return f a l s e ;<br />
81 }<br />
bool QGecko : : c l o s e ( )<br />
{<br />
i f ( geckoCom != 0) {<br />
86 u s b r e l e a s e i n t e r f a c e ( geckoCom , GECKO COM INTERFACE) ; // u n r e g i s t e r t h e i n t e r f a c e<br />
from t h e os<br />
u s b c l o s e ( geckoCom ) ; // c l o s e t h e usb connection<br />
geckoCom = 0 ; // r e s e t s t h e d e v i c e handler so we can d e t e c t t h a t i t i s c l o s e d<br />
Project Report 105
E. Quellcode<br />
return true ;<br />
}<br />
91 return f a l s e ;<br />
}<br />
bool QGecko : : read ( QByteArray ∗ readData , int byteCount )<br />
{<br />
96 // reads data through t h e communication i n t e r f a c e from t h e f p g a<br />
i f ( geckoCom != 0) {<br />
char data [ 3 2 7 6 8 ] ;<br />
int r = u s b b u l k r e a d ( geckoCom , GECKO COM EP READ, data , byteCount , 5000) ;<br />
i f ( r != 0) {<br />
101 readData−>append ( QByteArray ( data , byteCount ) ) ;<br />
return true ;<br />
}<br />
}<br />
return f a l s e ;<br />
106 }<br />
bool QGecko : : w r i t e ( QFile &data ) { // w r i t e s a whole f i l e through t h e communication<br />
i n t e r f a c e to t h e f p g a<br />
i f ( geckoCom != 0) {<br />
bool loop = true ;<br />
111 char t a r g e t A r r a y [ 3 2 7 6 8 ] ;<br />
int t a r g e t S i z e = 0 ;<br />
// t h e l i b u s b use an i n t v a l u e as s i z e , so we must s p l i t t h e f i l e i n t o m u l t i p l e<br />
t r a n s f e r s<br />
while ( loop == true ) {<br />
116 t a r g e t S i z e = data . read ( targetArray , 32768 ) ;<br />
i f ( t a r g e t S i z e > 0) {<br />
int w = u s b b u l k w r i t e ( geckoCom , GECKO COM EP WRITE, t a r g e t A r r a y ,<br />
t a r g e t S i z e , 5000) ;<br />
i f (w0){<br />
136 return true ;<br />
}<br />
}<br />
return f a l s e ;<br />
}<br />
141<br />
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />
// f u n c t i o n s f o r a l l t h e a d m i n i s t r a t i v s t u f f :<br />
bool QGecko : : admOpen ( ) {<br />
//same t h i n g as QGecko : : open ( ) only f o r t h e a d m i n i s t r a t i o n i n t e r f a c e<br />
146 struct usb bus ∗ b u s s e s ;<br />
u s b f i n d b u s s e s ( ) ;<br />
u s b f i n d d e v i c e s ( ) ;<br />
106 Matthias Zurbrügg, Christoph Zimmermann
E.3. Hostsoftware<br />
151 b u s s e s = u s b g e t b u s s e s ( ) ;<br />
struct usb bus ∗ bus ;<br />
for ( bus = b u s s e s ; bus ; bus = bus−>next ) {<br />
156 struct u s b d e v i c e ∗ dev ;<br />
for ( dev = bus−>d e v i c e s ; dev ; dev = dev−>next ) {<br />
i f ( dev−>d e s c r i p t o r . idVendor == ID VENDOR GECKO3) {<br />
i f ( dev−>d e s c r i p t o r . idProduct == ID PRODUCT GECKO3) {<br />
161 geckoAdm = usb open ( dev ) ;<br />
char dr name [ 1 0 0 ] ;<br />
int np = u s b g e t d r i v e r n p ( geckoAdm , 0 , dr name , 100) ;<br />
i f ( np==0) {<br />
u s b d e t a c h k e r n e l d r i v e r n p ( geckoAdm , 0) ;<br />
166 }<br />
int t = u s b c l a i m i n t e r f a c e ( geckoAdm , GECKO ADM INTERFACE) ;<br />
i f ( t == 0) {<br />
return true ; //end o f s e a r c h i n g f o r d e v i c e s . t h e f i r s t found<br />
d e v i c e i s used<br />
}<br />
171 else {<br />
return f a l s e ;<br />
}<br />
}<br />
}<br />
176 }<br />
}<br />
return f a l s e ;<br />
}<br />
181 bool QGecko : : admClose ( )<br />
{<br />
//same t h i n g as QGecko : : c l o s e ( ) only f o r t h e a d m i n i s t r a t i o n i n t e r f a c e<br />
i f ( geckoAdm != 0) {<br />
u s b r e l e a s e i n t e r f a c e ( geckoAdm , GECKO ADM INTERFACE) ;<br />
186 u s b c l o s e ( geckoAdm ) ;<br />
geckoAdm = 0 ;<br />
return true ;<br />
}<br />
return f a l s e ;<br />
191 }<br />
bool QGecko : : admWrite ( QFile &data ) {<br />
//same t h i n g as QGecko : : w r i t e ( QFile &data ) only f o r t h e a d m i n i s t r a t i o n i n t e r f a c e<br />
i f ( geckoAdm != 0) {<br />
196 bool loop = true ;<br />
char t a r g e t A r r a y [ 3 2 7 6 8 ] ;<br />
int t a r g e t S i z e = 0 ;<br />
while ( loop == true ) {<br />
201 t a r g e t S i z e = data . read ( targetArray , 32768 ) ;<br />
i f ( t a r g e t S i z e > 0) {<br />
int w = u s b b u l k w r i t e ( geckoAdm , GECKO ADM EP WRITE, t a r g e t A r r a y ,<br />
t a r g e t S i z e , 5000) ;<br />
i f (w
E. Quellcode<br />
216<br />
221<br />
}<br />
return f a l s e ;<br />
bool QGecko : : admConfigure ( QFile &configData ) {<br />
i f ( geckoAdm != 0) {<br />
// send t h e vendor r e q u e s t to s t a r t t h e f p g a c o n f i g u r a t i o n<br />
int b = u s b c o n t r o l m s g ( geckoAdm , USB TYPE VENDOR, GECKO CONFIGURE FPGA, 0 , 0 ,<br />
”” , 0 , 1000) ;<br />
i f ( b>=0){<br />
// w r i t e s t h e b i t s t r e a m i n t o t h e f pga<br />
i f ( admWrite ( configData ) ) {<br />
char done [ 2 ] ;<br />
226 // checks i f t h e done s i g n a l from t h e f p g a i s a s s e r t e d<br />
int w = u s b c o n t r o l m s g ( geckoAdm , USB TYPE VENDOR | USB ENDPOINT DIR MASK,<br />
GECKO CONFIGURE DONE, 0 , 0 , done , 1 , 1000) ;<br />
i f (w>=0 && done [ 0 ] == char (GECKO CONFIGURE DONE) ) {<br />
return true ;<br />
231 }<br />
}<br />
}<br />
}<br />
return f a l s e ;<br />
236 }<br />
bool QGecko : : admDownload ( QFile &configData , int p l a c e ) {<br />
i f ( geckoAdm != 0) {<br />
// send t h e vendor r e q u e s t to s t a r t t h e download o f a b i t s t r e a m to t h e f l a s h ,<br />
i n c l u d i n g t h e d e s i r e d memory s l o t<br />
241 int b = u s b c o n t r o l m s g ( geckoAdm , USB TYPE VENDOR, GECKO SEND CONFIGURATION,<br />
place , 0 , ”” , 0 , 1000) ;<br />
i f ( b>=0){<br />
// w r i t e s t h e b i t s t r e a m i n t o t h e s p i f l a s h<br />
i f ( admWrite ( configData ) ) {<br />
// send t h e vendor r e q u e s t to s i g n a l i s e t h e end o f t h e b i t s t r e a m download<br />
246 int w = u s b c o n t r o l m s g ( geckoAdm , USB TYPE VENDOR, GECKO SEND END, 0 , 0 , ”” ,<br />
0 , 1000) ;<br />
i f (w>=0) {<br />
return true ;<br />
}<br />
}<br />
251 }<br />
}<br />
return f a l s e ;<br />
}<br />
256 bool QGecko : : admFirmware ( QFile &configData ) {<br />
i f ( geckoAdm != 0) {<br />
// send t h e vendor r e q u e s t to s t a r t t h e download o f a c y p r e s s firmware f i l e ( in<br />
t h e i i c format )<br />
int b = u s b c o n t r o l m s g ( geckoAdm , USB TYPE VENDOR, GECKO SEND FW, 0 , 0 , ”” , 0 ,<br />
1000) ;<br />
i f ( b>=0){<br />
261 // w r i t e s t h e b i t s t r e a m i n t o t h e eeprom<br />
i f ( admWrite ( configData ) ) {<br />
// send t h e vendor r e q u e s t to s i g n a l i s e t h e end o f t h e firmware download<br />
int w = u s b c o n t r o l m s g ( geckoAdm , USB TYPE VENDOR, GECKO SEND END, 0 , 0 , ”” ,<br />
0 , 1000) ;<br />
i f (w>=0) {<br />
266 return true ;<br />
}<br />
}<br />
}<br />
}<br />
271 return f a l s e ;<br />
108 Matthias Zurbrügg, Christoph Zimmermann
E.3. Hostsoftware<br />
}<br />
bool QGecko : : admGetFwVersion ( QString ∗ v e r s i o n ) {<br />
i f ( geckoAdm != 0) {<br />
276 char fw [ 5 ] = ”” ;<br />
// send t h e vendor r e q u e s t to r e q u e s t t h e firmware v e r s i o n . t h e number i s in t h e<br />
format X.XX<br />
int b = u s b c o n t r o l m s g ( geckoAdm , USB TYPE VENDOR | USB ENDPOINT DIR MASK,<br />
GECKO FW VERSION, 0 , 0 , fw , 4 , 1000) ;<br />
i f ( b>=0){<br />
281 // append t h e r e c e i v e d v e r s i o n to t h e passed QString<br />
v e r s i o n −>append ( QByteArray ( fw , 4) ) ;<br />
return true ;<br />
}<br />
}<br />
286 return f a l s e ;<br />
}<br />
E.3.2. Gecko Administrator<br />
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
∗ Diplomwork :<br />
3 ∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
∗<br />
∗ ( ‘ \ ( ) ( ) ( )<br />
∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
∗ | < ’| ) | | School o f Engineering and<br />
8 ∗ | ( ) ) | | | | | | Information Technology<br />
∗ ( / ’( ) ( ) ( )<br />
∗<br />
∗<br />
∗ Author : Christoph Zimmermann<br />
13 ∗ Date o f c r e a t i o n : 3.12.2006<br />
∗ D e s c r i p t i o n :<br />
∗ main f i l e o f t h e Gecko Administrator programm<br />
∗ a c c e p t s t h e f o l l o w i n g command l i n e arguments :<br />
∗ −−firmware shows t h e download firmware t a b . d e f a u l t i t i s i n v i s i b l e<br />
18 ∗<br />
∗ Changelog :<br />
∗ 3.12.2006<br />
∗ f i r s t v e r s i o n<br />
∗<br />
23 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
#include <br />
#include ”geckoadm . h”<br />
28 int main ( int argc , char ∗∗ argv ) {<br />
QApplication a ( argc , argv ) ;<br />
geckoadm ∗ mw = new geckoadm ( ) ;<br />
mw−>show ( ) ;<br />
a . connect ( &a , SIGNAL( lastWindowClosed ( ) ) , &a , SLOT( q u i t ( ) ) ) ;<br />
33 return a . exec ( ) ;<br />
}<br />
1 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
∗ Diplomwork :<br />
∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
∗<br />
∗ ( ‘ \ ( ) ( ) ( )<br />
6 ∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
∗ | < ’| ) | | School o f Engineering and<br />
Project Report 109
E. Quellcode<br />
∗ | ( ) ) | | | | | | Information Technology<br />
∗ ( / ’( ) ( ) ( )<br />
∗<br />
11 ∗<br />
∗ Author : Christoph Zimmermann<br />
∗ Date o f c r e a t i o n : 3.12.2006<br />
∗ D e s c r i p t i o n :<br />
∗ H e a d e r f i l e f o r t h e gecko 3 h o s t s o f t w a r e<br />
16 ∗<br />
∗ Changelog :<br />
∗ 3.12.2006<br />
∗ f i r s t v e r s i o n<br />
∗<br />
21 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
#ifndef SIMPLECOM H<br />
#define SIMPLECOM H<br />
26 #include <br />
#include <br />
#include <br />
#include <br />
31 #include <br />
#include <br />
#include <br />
#include <br />
#include <br />
36 #include <br />
#include <br />
#include <br />
#include <br />
#include <br />
41 #include <br />
#include <br />
#include <br />
#include <br />
#include <br />
46 #include <br />
#include <br />
#include <br />
#include ” gecko . h” // header f i l e o f t h e gecko c l a s s<br />
51<br />
class QTextEdit ;<br />
class geckoadm : public QWidget<br />
{<br />
56 Q OBJECT<br />
61<br />
public :<br />
geckoadm ( QWidget ∗ parent = 0) ;<br />
˜geckoadm ( ) ;<br />
protected :<br />
private s l o t s :<br />
void c l o s e E v e n t ( QClose<strong>Event</strong> ∗) ;<br />
66 void c o n f i g u r e ( ) ;<br />
void c h o o s e C o n f i g u r e ( ) ;<br />
void download ( ) ;<br />
void chooseDownload ( ) ;<br />
void firmware ( ) ;<br />
71 void chooseFirmware ( ) ;<br />
void getFirmwareVersion ( ) ;<br />
110 Matthias Zurbrügg, Christoph Zimmermann
E.3. Hostsoftware<br />
private :<br />
Q S t r i n g L i s t ∗ arguments ;<br />
76 QGecko ∗ gecko ;<br />
QString ∗ c o n f i g Path ;<br />
QString ∗ downloadPath ;<br />
QString ∗ firmwarePath ;<br />
QVBoxLayout ∗ layMain ;<br />
81 QStatusBar ∗ s t a t u s B a r ;<br />
QTabWidget ∗ tab ;<br />
QSize ∗ l i n e E d i t S i z e ;<br />
QWidget ∗ tabConfigure ;<br />
86 QVBoxLayout ∗ l a y C o n f i g u r e ;<br />
QLineEdit ∗ l e C o n f i g F i l e ;<br />
QPushButton ∗ b t C o n f i g F i l e ;<br />
QHBoxLayout ∗layConfigFPGA ;<br />
QPushButton ∗btConfigFPGA ;<br />
91<br />
QWidget ∗tabDownload ;<br />
QLineEdit ∗ leDownloadFile ;<br />
QPushButton ∗ btDownloadFile ;<br />
QPushButton ∗btDownload ;<br />
96 QHBoxLayout ∗ layDownloadButton ;<br />
QSpinBox ∗ s e l e c t C o n f i g ;<br />
QLabel ∗ l a S e l e c t C o n f i g ;<br />
QHBoxLayout ∗ l a y S e l e c t C o n f i g ;<br />
QVBoxLayout ∗ layDownload ;<br />
101<br />
QWidget ∗ tabFirmware ;<br />
QLineEdit ∗ leFirmwareVersion ;<br />
QPushButton ∗ btFirmwareVersion ;<br />
106 QLabel ∗ laFirmwareVersion ;<br />
QLineEdit ∗ l e F i r m w a r e F i l e ;<br />
QPushButton ∗ btFirmwareFile ;<br />
QPushButton ∗ btFirmware ;<br />
QHBoxLayout ∗ layFirmwareButton ;<br />
111 QHBoxLayout ∗ layFirmwareVersion ;<br />
QVBoxLayout ∗ layFirmware ;<br />
QWidget ∗ tabAbout ;<br />
QVBoxLayout ∗ layAbout ;<br />
116 QHBoxLayout ∗layHAbout ;<br />
QLabel ∗ laGecko ;<br />
QLabel ∗ l a V e r s i o n ;<br />
QLabel ∗ laDate ;<br />
QLabel ∗ l a D e v e l o p e r s ;<br />
121 QLabel ∗ l a O r g a n i s a t i o n ;<br />
QLabel ∗ l a U r l ;<br />
} ;<br />
#endif<br />
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
∗ Diplomwork :<br />
∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
∗<br />
5 ∗ ( ‘ \ ( ) ( ) ( )<br />
∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
∗ | < ’| ) | | School o f Engineering and<br />
∗ | ( ) ) | | | | | | Information Technology<br />
∗ ( / ’( ) ( ) ( )<br />
10 ∗<br />
∗<br />
∗ Author : Christoph Zimmermann<br />
∗ Date o f c r e a t i o n : 20.11.2006<br />
Project Report 111
E. Quellcode<br />
∗ D e s c r i p t i o n :<br />
15 ∗ Gecko 3 h o s t s o f t w a r e . a l l a d m i n i s t r a t i v e t a s k s o f t h e gecko board<br />
∗ are u s a b l e with t h i s s o f t w a r e :<br />
∗ c o n f i g u r e t h e f p g a<br />
∗ download f p g a c o n f i g f i l e s to t h e onboard memory<br />
∗ download new ez−usb firmware<br />
20 ∗<br />
∗ Changelog :<br />
∗ 3.12.2006<br />
∗ f i r s t version , GUI implemented<br />
∗<br />
25 ∗ 4.12.2006<br />
∗ usb f u n c t i o n s implemented<br />
∗ use o f QSettings to save information f o r b e t t e r u s a b i l i t y<br />
∗<br />
∗ 5.12.2006<br />
30 ∗ t e s t i n g and b u g f i x e s<br />
∗<br />
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
#include ”geckoadm . h”<br />
35<br />
#define VERSION QString ( ” 0 . 1 ” )<br />
#define DATE QString ( ” 3 . 1 2 . 2 0 0 6 ” )<br />
#define DEVELOPERS QString ( ” Matthias Zurbrgg , Christoph Zimmermann” )<br />
#define ORGANISATION QString ( ” Berne U n i v e r s i t y o f Applied S c i e n c e s , Microlab ” )<br />
40 #define URL QString ( ”www. microlab . ch” )<br />
geckoadm : : geckoadm ( QWidget ∗ parent )<br />
: QWidget ( parent )<br />
{<br />
45 gecko = new QGecko ( ) ;<br />
QSettings : : setPath ( QSettings : : IniFormat , QSettings : : UserScope , 0) ;<br />
QCoreApplication : : setOrganizationName ( ”BFH Microlab ” ) ;<br />
QCoreApplication : : setOrganizationDomain ( ” microlab . ch” ) ;<br />
50 QCoreApplication : : setApplicationName ( ”Gecko 3 Administation Program” ) ;<br />
QSettings s e t t i n g s ;<br />
i f ( s e t t i n g s . c o n t a i n s ( ” c o n f i g Path ” ) ) {<br />
c o n f i g Path = new QString ( s e t t i n g s . value ( ” configPath ” ) . t o S t r i n g ( ) ) ;<br />
}<br />
55 else {<br />
c o n f i g Path = new QString ( ) ;<br />
}<br />
i f ( s e t t i n g s . c o n t a i n s ( ” downloadPath ” ) ) {<br />
downloadPath = new QString ( s e t t i n g s . value ( ” downloadPath ” ) . t o S t r i n g ( ) ) ;<br />
60 }<br />
else {<br />
downloadPath = new QString ( ) ;<br />
}<br />
i f ( s e t t i n g s . c o n t a i n s ( ” firmwarePath ” ) ) {<br />
65 firmwarePath = new QString ( s e t t i n g s . value ( ” firmwarePath ” ) . t o S t r i n g ( ) ) ;<br />
}<br />
else {<br />
firmwarePath = new QString ( ) ;<br />
}<br />
70<br />
// c r e a t e t h e c o n f i g u r e FPGA t a b<br />
tabConfigure = new QWidget ( ) ;<br />
l e C o n f i g F i l e = new QLineEdit ( ) ;<br />
l e C o n f i g F i l e −>setReadOnly ( true ) ;<br />
75 l e C o n f i g F i l e −>setText (∗ c o n f i g Path ) ;<br />
l e C o n f i g F i l e −>setMinimumSize ( QSize ( 100 ,<br />
QFontMetrics ( l e C o n f i g F i l e −>f o n t ( ) ) . h e i g h t ( ) ) ) ;<br />
b t C o n f i g F i l e = new QPushButton ( t r ( ” S e l e c t c o n f i g f i l e ” ) ) ;<br />
connect ( b t C o n f i g F i l e , SIGNAL( c l i c k e d ( ) ) , this , SLOT( c h o o s e C o n f i g u r e ( ) ) ) ;<br />
112 Matthias Zurbrügg, Christoph Zimmermann
E.3. Hostsoftware<br />
btConfigFPGA = new QPushButton ( t r ( ” Configure FPGA” ) ) ;<br />
80 btConfigFPGA−>s e t F i x e d S i z e ( 140 , 50 ) ;<br />
connect ( btConfigFPGA , SIGNAL( c l i c k e d ( ) ) , this , SLOT( c o n f i g u r e ( ) ) ) ;<br />
layConfigFPGA = new QHBoxLayout ( ) ;<br />
layConfigFPGA−>addWidget ( btConfigFPGA ) ;<br />
85<br />
l a y C o n f i g u r e = new QVBoxLayout ( ) ;<br />
l a yConfigure −>addWidget ( b t C o n f i g F i l e ) ;<br />
l a yConfigure −>addWidget ( l e C o n f i g F i l e ) ;<br />
l a yConfigure −>addLayout ( layConfigFPGA ) ;<br />
90 tabConfigure −>setLayout ( l a y C o n f i g u r e ) ;<br />
// c r e a t e t h e download c o n f i g u r a t i o n t a b<br />
tabDownload = new QWidget ( ) ;<br />
leDownloadFile = new QLineEdit ( ) ;<br />
95 leDownloadFile −>setReadOnly ( true ) ;<br />
leDownloadFile −>setText (∗ downloadPath ) ;<br />
leDownloadFile −>setMinimumSize ( QSize ( 100 ,<br />
QFontMetrics ( leDownloadFile −>f o n t ( ) ) . h e i g h t ( ) ) ) ;<br />
btDownloadFile = new QPushButton ( t r ( ” S e l e c t c o n f i g f i l e ” ) ) ;<br />
connect ( btDownloadFile , SIGNAL( c l i c k e d ( ) ) , this , SLOT( chooseDownload ( ) ) ) ;<br />
100 btDownload = new QPushButton ( t r ( ”Download” ) ) ;<br />
btDownload−>s e t F i x e d S i z e ( 140 , 50 ) ;<br />
connect ( btDownload , SIGNAL( c l i c k e d ( ) ) , this , SLOT( download ( ) ) ) ;<br />
layDownloadButton = new QHBoxLayout ( ) ;<br />
105 layDownloadButton−>addWidget ( btDownload ) ;<br />
s e l e c t C o n f i g = new QSpinBox ( ) ;<br />
s e l e c t C o n f i g −>setRange ( 0 , GECKO MAX CONFIGS−1) ;<br />
s e l e c t C o n f i g −>s e t F i x e d S i z e ( QSize ( 40 ,<br />
2∗ QFontMetrics ( leDownloadFile −>f o n t ( ) ) . h e i g h t ( ) ) ) ;<br />
110 l a S e l e c t C o n f i g = new QLabel ( t r ( ” Choose c o n f i g f i l e t a r g e t memory : ” ) ) ;<br />
l a y S e l e c t C o n f i g = new QHBoxLayout ( ) ;<br />
l a y S e l e c t C o n f i g −>addWidget ( l a S e l e c t C o n f i g ) ;<br />
l a y S e l e c t C o n f i g −>addWidget ( s e l e c t C o n f i g ) ;<br />
115 layDownload = new QVBoxLayout ( ) ;<br />
layDownload−>addWidget ( btDownloadFile ) ;<br />
layDownload−>addWidget ( leDownloadFile ) ;<br />
layDownload−>addLayout ( l a y S e l e c t C o n f i g ) ;<br />
layDownload−>addLayout ( layDownloadButton ) ;<br />
120 tabDownload−>setLayout ( layDownload ) ;<br />
// c r e a t e t h e download firmware t a b<br />
tabFirmware = new QWidget ( ) ;<br />
laFirmwareVersion = new QLabel ( t r ( ” Current firmware v e r s i o n : ” ) ) ;<br />
125 leFirmwareVersion = new QLineEdit ( ) ;<br />
leFirmwareVersion −>setReadOnly ( true ) ;<br />
leFirmwareVersion −>s e t F i x e d S i z e ( QSize ( 60 ,<br />
QFontMetrics ( leFirmwareVersion−>f o n t ( ) ) . h e i g h t ( ) ) ) ;<br />
btFirmwareVersion = new QPushButton ( t r ( ”Get firmware v e r s i o n ” ) ) ;<br />
connect ( btFirmwareVersion , SIGNAL( c l i c k e d ( ) ) , this , SLOT( getFirmwareVersion ( ) ) ) ;<br />
130<br />
layFirmwareVersion = new QHBoxLayout ( ) ;<br />
layFirmwareVersion−>addWidget ( laFirmwareVersion ) ;<br />
layFirmwareVersion−>addWidget ( leFirmwareVersion ) ;<br />
135 l e F i r m w a r e F i l e = new QLineEdit ( ) ;<br />
leFirmwareFile −>setReadOnly ( true ) ;<br />
leFirmwareFile −>setText (∗ firmwarePath ) ;<br />
leFirmwareFile −>setMinimumSize ( QSize ( 100 ,<br />
QFontMetrics ( leFirmwareFile −>f o n t ( ) ) . h e i g h t ( ) ) ) ;<br />
btFirmwareFile = new QPushButton ( t r ( ” S e l e c t firmware f i l e ” ) ) ;<br />
140 connect ( btFirmwareFile , SIGNAL( c l i c k e d ( ) ) , this , SLOT( chooseFirmware ( ) ) ) ;<br />
Project Report 113
E. Quellcode<br />
btFirmware = new QPushButton ( t r ( ”Download firmware ” ) ) ;<br />
btFirmware−>s e t F i x e d S i z e ( 140 , 50 ) ;<br />
connect ( btFirmware , SIGNAL( c l i c k e d ( ) ) , this , SLOT( firmware ( ) ) ) ;<br />
145 layFirmwareButton = new QHBoxLayout ( ) ;<br />
layFirmwareButton−>addWidget ( btFirmware ) ;<br />
layFirmware = new QVBoxLayout ( ) ;<br />
layFirmware−>addWidget ( btFirmwareVersion ) ;<br />
150 layFirmware−>addLayout ( layFirmwareVersion ) ;<br />
layFirmware−>addWidget ( btFirmwareFile ) ;<br />
layFirmware−>addWidget ( l e F i r m w a r e F i l e ) ;<br />
layFirmware−>addLayout ( layFirmwareButton ) ;<br />
tabFirmware−>setLayout ( layFirmware ) ;<br />
155<br />
// c r e a t e t h e about t a b<br />
tabAbout = new QWidget ( ) ;<br />
laGecko = new QLabel ( t r ( ”Gecko 3 Administration Program” ) ) ;<br />
l a V e r s i o n = new QLabel ( t r ( ” Version : ” ) + VERSION) ;<br />
160 laDate = new QLabel ( t r ( ”Date : ” ) + DATE) ;<br />
l a D e v e l o p e r s = new QLabel (DEVELOPERS) ;<br />
l a O r g a n i s a t i o n = new QLabel (ORGANISATION) ;<br />
l a U r l = new QLabel (URL) ;<br />
layAbout = new QVBoxLayout ( ) ;<br />
165 layAbout−>addWidget ( laGecko ) ;<br />
layAbout−>addWidget ( l a V e r s i o n ) ;<br />
layAbout−>addWidget ( laDate ) ;<br />
layAbout−>addWidget ( l a D e v e l o p e r s ) ;<br />
layAbout−>addWidget ( l a O r g a n i s a t i o n ) ;<br />
170 layAbout−>addWidget ( l a U r l ) ;<br />
layHAbout = new QHBoxLayout ( ) ;<br />
layHAbout−>addLayout ( layAbout ) ;<br />
tabAbout−>setLayout ( layHAbout ) ;<br />
175 // c r e a t e t h e s t a t u s bar<br />
s t a t u s B a r = new QStatusBar ( ) ;<br />
statusBar −>s e t S i z e G r i p E n a b l e d ( f a l s e ) ;<br />
statusBar −>showMessage ( t r ( ”Ready” ) ) ;<br />
180 // add anything t o g h e t e r in t h e t a b s<br />
tab = new QTabWidget ( ) ;<br />
tab−>addTab ( tabConfigure , t r ( ” Configure FPGA” ) ) ;<br />
tab−>addTab ( tabDownload , t r ( ”Download C o n f i g u r a t i o n s ” ) ) ;<br />
tab−>addTab ( tabFirmware , t r ( ”Download Firmware” ) ) ;<br />
185 tab−>addTab ( tabAbout , t r ( ”About” ) ) ;<br />
// c r e a t e t h e main window<br />
layMain = new QVBoxLayout ( ) ;<br />
layMain−>addWidget ( tab ) ;<br />
190 layMain−>addWidget ( s t atusBar ) ;<br />
setLayout ( layMain ) ;<br />
setWindowTitle ( t r ( ”Gecko 3 Administrator ” ) ) ;<br />
s e t F i x e d H e i g h t ( 2 6 0 ) ;<br />
r e s i z e ( 450 , 260 ) ;<br />
195 }<br />
geckoadm : : ˜ geckoadm ( )<br />
{<br />
}<br />
200<br />
void geckoadm : : c l o s e E v e n t ( QClose<strong>Event</strong> ∗)<br />
{<br />
QSettings s e t t i n g s ;<br />
s e t t i n g s . setValue ( ” c o n f i gPath ” , ∗ configPath ) ;<br />
205 s e t t i n g s . setValue ( ” downloadPath ” , ∗ downloadPath ) ;<br />
s e t t i n g s . setValue ( ” firmwarePath ” , ∗ firmwarePath ) ;<br />
114 Matthias Zurbrügg, Christoph Zimmermann
E.3. Hostsoftware<br />
}<br />
void geckoadm : : c o n f i g u r e ( )<br />
210 {<br />
i f ( ! configPath −>isEmpty ( ) ) {<br />
bool t = gecko−>admOpen ( ) ;<br />
i f ( t == true ) {<br />
statusBar −>showMessage ( t r ( ” Device found and ready ” ) ) ;<br />
215 QFile f ( ∗ c o n f i gPath ) ;<br />
i f ( ! f . open ( QIODevice : : ReadOnly ) ) {<br />
statusBar −>showMessage ( t r ( ” Error : F i l e could not be opend” ) ) ;<br />
return ;<br />
}<br />
220<br />
bool s t a t e = gecko−>admConfigure ( f ) ;<br />
i f ( s t a t e ) {<br />
statusBar −>showMessage ( t r ( ”FPGA s u c c e s s f u l l y c o n f i g u r e d ” ) ) ;<br />
}<br />
225 else {<br />
statusBar −>showMessage ( t r ( ” Error : FPGA could not be c o n f i g u r e d . Check the<br />
FPGA type ” ) ) ;<br />
}<br />
f . c l o s e ( ) ;<br />
230 gecko−>admClose ( ) ;<br />
}<br />
else {<br />
statusBar −>showMessage ( t r ( ” Error : No Gecko found . P l e a s e check the USB<br />
c o n n e c t i o n ” ) ) ;<br />
}<br />
235 }<br />
else {<br />
QMessageBox : : warning ( this , t r ( ”No f i l e s e l e c t e d ” ) , t r ( ”You have to s e l e c t a F i l e<br />
b e f o r e you can c o n f i g u r e the FPGA” ) , QMessageBox : : Ok, QMessageBox : : NoButton ) ;<br />
}<br />
}<br />
240<br />
void geckoadm : : c h o o s e C o n f i g u r e ( )<br />
{<br />
∗ c o n f i g Path = QFileDialog : : getOpenFileName ( this , t r ( ” Choose FPGA c o n f i g F i l e ” ) ,<br />
∗ configPath , ” X i l i n x Bin F i l e s ( ∗ . bin ) ” ) ;<br />
l e C o n f i g F i l e −>setText (∗ c onfigPath ) ;<br />
245 }<br />
void geckoadm : : download ( )<br />
{<br />
i f ( ! downloadPath−>isEmpty ( ) ) {<br />
250 bool t = gecko−>admOpen ( ) ;<br />
i f ( t == true ) {<br />
statusBar −>showMessage ( t r ( ” Device found and ready ” ) ) ;<br />
QFile f ( ∗ downloadPath ) ;<br />
i f ( ! f . open ( QIODevice : : ReadOnly ) ) {<br />
255 statusBar −>showMessage ( t r ( ” Error : F i l e could not be opend” ) ) ;<br />
return ;<br />
}<br />
bool s t a t e = gecko−>admDownload ( f , s e l e c t C o n f i g −>value ( ) ) ;<br />
260 i f ( s t a t e ) {<br />
statusBar −>showMessage ( t r ( ” C o n f i g u r a t i o n s u c c e s s f u l l y downloaded ” ) ) ;<br />
}<br />
else {<br />
statusBar −>showMessage ( t r ( ” Error : C o n f i g u r a t i o n not downloaded ” ) ) ;<br />
265 }<br />
f . c l o s e ( ) ;<br />
gecko−>admClose ( ) ;<br />
Project Report 115
E. Quellcode<br />
}<br />
270 else {<br />
statusBar −>showMessage ( t r ( ” Error : No Gecko found . P l e a s e check the USB<br />
c o n n e c t i o n ” ) ) ;<br />
}<br />
}<br />
else {<br />
275 QMessageBox : : warning ( this , t r ( ”No f i l e s e l e c t e d ” ) , t r ( ”You have to s e l e c t a F i l e<br />
b e f o r e you can c o n f i g u r e the FPGA” ) , QMessageBox : : Ok, QMessageBox : : NoButton ) ;<br />
}<br />
}<br />
void geckoadm : : chooseDownload ( )<br />
280 {<br />
∗ downloadPath = QFileDialog : : getOpenFileName ( this , t r ( ” Choose FPGA c o n f i g F i l e ” ) ,<br />
∗downloadPath , ” X i l i n x Bin F i l e s ( ∗ . bin ) ” ) ;<br />
leDownloadFile −>setText (∗ downloadPath ) ;<br />
}<br />
285 void geckoadm : : firmware ( )<br />
{<br />
i f ( ! firmwarePath−>isEmpty ( ) ) {<br />
bool t = gecko−>admOpen ( ) ;<br />
i f ( t == true ) {<br />
290 statusBar −>showMessage ( t r ( ” Device found and ready ” ) ) ;<br />
QFile f ( ∗ firmwarePath ) ;<br />
i f ( ! f . open ( QIODevice : : ReadOnly ) ) {<br />
statusBar −>showMessage ( t r ( ” Error : F i l e could not be opend” ) ) ;<br />
return ;<br />
295 }<br />
bool s t a t e = gecko−>admFirmware ( f ) ;<br />
i f ( s t a t e ) {<br />
statusBar −>showMessage ( t r ( ”Firmware s u c c e s s f u l l y downloaded ” ) ) ;<br />
300 }<br />
else {<br />
statusBar −>showMessage ( t r ( ” Error : Firmware not downloaded ” ) ) ;<br />
}<br />
305 f . c l o s e ( ) ;<br />
gecko−>admClose ( ) ;<br />
}<br />
else {<br />
statusBar −>showMessage ( t r ( ” Error : No Gecko found . P l e a s e check the USB<br />
c o n n e c t i o n ” ) ) ;<br />
310 }<br />
}<br />
else {<br />
QMessageBox : : warning ( this , t r ( ”No f i l e s e l e c t e d ” ) , t r ( ”You have to s e l e c t a<br />
F i r m w a r e f i l e b e f o r e you can download i t ” ) , QMessageBox : : Ok,<br />
QMessageBox : : NoButton ) ;<br />
}<br />
315 }<br />
void geckoadm : : chooseFirmware ( )<br />
{<br />
∗ firmwarePath = QFileDialog : : getOpenFileName ( this , t r ( ” Choose Cypress Firmware<br />
F i l e ” ) , ∗ firmwarePath , ” Cypress Firmware F i l e ( ∗ . i i c ) ” ) ;<br />
320 leFirmwareFile −>setText (∗ firmwarePath ) ;<br />
}<br />
void geckoadm : : getFirmwareVersion ( )<br />
{<br />
325 bool t = gecko−>admOpen ( ) ;<br />
i f ( t == true ) {<br />
statusBar −>showMessage ( t r ( ” Device found and ready ” ) ) ;<br />
116 Matthias Zurbrügg, Christoph Zimmermann
E.3. Hostsoftware<br />
QString ∗ v e r s i o n = new QString ( ) ;<br />
bool s t a t e = gecko−>admGetFwVersion ( v e r s i o n ) ;<br />
330 i f ( s t a t e ) {<br />
leFirmwareVersion −>setText (∗ v e r s i o n ) ;<br />
statusBar −>showMessage ( t r ( ” Firmwareversion s u c c e s s f u l l y read ” ) ) ;<br />
}<br />
else {<br />
335 statusBar −>showMessage ( t r ( ” Error : Firmwareversion could not be read ” ) ) ;<br />
}<br />
gecko−>admClose ( ) ;<br />
}<br />
340 else {<br />
statusBar −>showMessage ( t r ( ” Error : No Gecko found . P l e a s e check the USB<br />
c o n n e c t i o n ” ) ) ;<br />
}<br />
}<br />
E.3.3. Simplecom<br />
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
2 ∗ Diplomwork :<br />
∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
∗<br />
∗ ( ‘ \ ( ) ( ) ( )<br />
∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
7 ∗ | < ’| ) | | School o f Engineering and<br />
∗ | ( ) ) | | | | | | Information Technology<br />
∗ ( / ’( ) ( ) ( )<br />
∗<br />
∗<br />
12 ∗ Author : Christoph Zimmermann<br />
∗ Date o f c r e a t i o n : 20.11.2006<br />
∗ D e s c r i p t i o n :<br />
∗<br />
∗<br />
17 ∗ Changelog :<br />
∗ 29.11.2006<br />
∗ f i r s t v e r s i o n<br />
∗<br />
∗ 5.12.2006<br />
22 ∗ new v e r s i o n t h a t use t h e QGecko c l a s s to show how easy you can<br />
∗ implement a own communication s o f t w a r e<br />
∗<br />
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
27 #ifndef SIMPLECOM H<br />
#define SIMPLECOM H<br />
#include <br />
32 #include <br />
#include <br />
#include <br />
#include <br />
#include <br />
37 #include <br />
#include <br />
#include <br />
#include <br />
#include <br />
42 #include <br />
#include <br />
#include <br />
Project Report 117
E. Quellcode<br />
#include ” gecko . h”<br />
47<br />
class QTextEdit ;<br />
class simplecom : public QWidget<br />
{<br />
52 Q OBJECT<br />
57<br />
public :<br />
simplecom ( QWidget ∗ parent = 0) ;<br />
˜ simplecom ( ) ;<br />
protected :<br />
private s l o t s :<br />
void c l o s e E v e n t ( QClose<strong>Event</strong> ∗) ;<br />
62 void send ( ) ;<br />
void r e c e i v e ( ) ;<br />
bool geckoConnect ( ) ;<br />
QString toHex ( QByteArray data ) ;<br />
uchar nibbleToHex ( uchar value ) ;<br />
67<br />
private :<br />
QTextEdit ∗ e ;<br />
QPushButton ∗ f i l e O p e n ;<br />
QPushButton ∗ r e c e i v e D a t a ;<br />
72 QLineEdit ∗ numberInput ;<br />
QVBoxLayout ∗ l a y o u t ;<br />
QGecko ∗ gecko ;<br />
QString path ;<br />
} ;<br />
77<br />
#endif<br />
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗<br />
2 ∗ Diplomwork :<br />
∗ <strong>Gecko3</strong> SoC HW/SW Development Board<br />
∗<br />
∗ ( ‘ \ ( ) ( ) ( )<br />
∗ | ( ) ) | ( | | | | Berne U n i v e r s i t y o f Applied S c i e n c e s<br />
7 ∗ | < ’| ) | | School o f Engineering and<br />
∗ | ( ) ) | | | | | | Information Technology<br />
∗ ( / ’( ) ( ) ( )<br />
∗<br />
∗<br />
12 ∗ Author : Christoph Zimmermann<br />
∗ Date o f c r e a t i o n : 20.11.2006<br />
∗ D e s c r i p t i o n :<br />
∗<br />
∗<br />
17 ∗ Changelog :<br />
∗ 29.11.2006<br />
∗ f i r s t v e r s i o n<br />
∗<br />
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/<br />
22<br />
#include ” simplecom . h”<br />
simplecom : : simplecom ( QWidget ∗ parent )<br />
: QWidget ( parent )<br />
27 {<br />
gecko = new QGecko ( ) ;<br />
QString path = QString : : n u l l ;<br />
118 Matthias Zurbrügg, Christoph Zimmermann
E.3. Hostsoftware<br />
32 f i l e O p e n = new QPushButton ( ) ;<br />
connect ( fileOpen , SIGNAL( c l i c k e d ( ) ) , this , SLOT( send ( ) ) ) ;<br />
fileOpen −>setText ( t r ( ”Send F i l e ” ) ) ;<br />
r e c e i v e D a t a = new QPushButton ( ) ;<br />
37 connect ( receiveData , SIGNAL( c l i c k e d ( ) ) , this , SLOT( r e c e i v e ( ) ) ) ;<br />
receiveData −>setText ( t r ( ”Read Data” ) ) ;<br />
numberInput = new QLineEdit ( ) ;<br />
numberInput−>s e t V a l i d a t o r (new QIntValidator ( 0 , 3000 , this ) ) ;<br />
42 connect ( numberInput , SIGNAL( r e t u r n P r e s s e d ( ) ) , this , SLOT( r e c e i v e ( ) ) ) ;<br />
e = new QTextEdit ( ) ;<br />
e−>setReadOnly ( true ) ;<br />
47 l a y o u t = new QVBoxLayout ;<br />
setLayout ( l a y o u t ) ;<br />
layout −>addWidget ( f i l e O p e n ) ;<br />
layout −>addWidget ( r e c e i v e D a t a ) ;<br />
layout −>addWidget ( numberInput ) ;<br />
52 layout −>addWidget ( e ) ;<br />
57<br />
}<br />
r e s i z e ( 450 , 600 ) ;<br />
// geckoConnect ( ) ;<br />
62<br />
simplecom : : ˜ simplecom ( )<br />
{<br />
}<br />
void simplecom : : c l o s e E v e n t ( QClose<strong>Event</strong> ∗)<br />
{<br />
// gecko−>c l o s e ( ) ;<br />
}<br />
67<br />
void simplecom : : send ( )<br />
{<br />
i f ( geckoConnect ( ) == true ) {<br />
QString fileName = QFileDialog : : getOpenFileName ( this , QString : : n u l l , path ) ;<br />
72 path = fileName ;<br />
i f ( ! fileName . isEmpty ( ) ) {<br />
QFile f ( fileName ) ;<br />
77 i f ( ! f . open ( QIODevice : : ReadOnly ) ) {<br />
e−>append ( t r ( ” Error opening f i l e ” ) ) ;<br />
return ;<br />
}<br />
i f ( gecko−>w r i t e ( f ) ) {<br />
82 f . r e s e t ( ) ;<br />
QByteArray data = f . r e a d A l l ( ) ;<br />
e−>append ( t r ( ” Sent Data:” ) + toHex ( data ) ) ;<br />
}<br />
// QByteArray data = f . r e a d A l l ( ) ;<br />
87 // i f ( gecko−>w r i t e ( data ) ) {<br />
// e−>append ( t r (” Sent Data:”) + toHex ( data ) ) ;<br />
// }<br />
else {<br />
e−>append ( t r ( ” Error sending data ” ) ) ;<br />
92 }<br />
f . c l o s e ( ) ;<br />
gecko−>c l o s e ( ) ;<br />
}<br />
}<br />
97 else<br />
Project Report 119
E. Quellcode<br />
{<br />
e−>append ( t r ( ”No d e v i c e connected . Can ’ t send f i l e ” ) ) ;<br />
}<br />
}<br />
102<br />
void simplecom : : r e c e i v e ( )<br />
{<br />
i f ( geckoConnect ( ) == true ) {<br />
bool ok ;<br />
107 int number = numberInput−>t e x t ( ) . t o I n t (&ok ) ;<br />
i f ( ok == true ) {<br />
QByteArray ∗ bla = new QByteArray ( ) ;<br />
112 bool t = gecko−>read ( bla , number ) ;<br />
i f ( t ) {<br />
QString r e c e i v e d = QString ( toHex (∗ bla ) ) ;<br />
e−>append ( t r ( ” Received Data : ” ) + r e c e i v e d ) ;<br />
}<br />
117 else {<br />
e−>append ( t r ( ” Error r e a d i n g data ” ) ) ;<br />
}<br />
}<br />
else {<br />
122 e−>append ( t r ( ” P l e a s e e n t e r the number o f bytes to read ” ) ) ;<br />
}<br />
}<br />
else<br />
{<br />
127 e−>append ( t r ( ”No d e v i c e connected . Can ’ t r e c e i v e data ” ) ) ;<br />
}<br />
gecko−>c l o s e ( ) ;<br />
}<br />
132 bool simplecom : : geckoConnect ( )<br />
{<br />
int t = gecko−>open ( ) ;<br />
i f ( t == true ) {<br />
e−>append ( t r ( ” Device found and ready ” ) ) ;<br />
137 return true ;<br />
}<br />
else {<br />
e−>append ( t r ( ” Error opening the Device ” ) ) ;<br />
return f a l s e ;<br />
142 }<br />
}<br />
QString simplecom : : toHex ( QByteArray data ) {<br />
QString ∗ s t r i n g = new QString ( ”” ) ;<br />
147<br />
for ( int i = 0 ; i < data . s i z e ( ) −1; i ++) {<br />
s t r i n g −>append ( ”0x” ) ;<br />
uchar value = uchar ( data . at ( i ) ) ;<br />
s t r i n g −>append (QChar( nibbleToHex ( ( value >>4)& 0x0F ) ) ) ;<br />
152 s t r i n g −>append (QChar( nibbleToHex ( value & 0x0F ) ) ) ;<br />
s t r i n g −>append ( ” , ” ) ;<br />
}<br />
s t r i n g −>append ( ”0x” ) ;<br />
uchar value = uchar ( data . at ( data . s i z e ( ) ) ) ;<br />
157 s t r i n g −>append (QChar( nibbleToHex ( ( value >>4)& 0x0F ) ) ) ;<br />
s t r i n g −>append (QChar( nibbleToHex ( value & 0x0F ) ) ) ;<br />
162<br />
}<br />
return ∗ s t r i n g ;<br />
uchar simplecom : : nibbleToHex ( uchar value ) {<br />
120 Matthias Zurbrügg, Christoph Zimmermann
E.3. Hostsoftware<br />
uchar hex = ’X ’ ;<br />
switch ( value ) {<br />
case 0 : hex = ’ 0 ’ ;<br />
167 break ;<br />
case 1 : hex = ’ 1 ’ ;<br />
break ;<br />
case 2 : hex = ’ 2 ’ ;<br />
break ;<br />
172 case 3 : hex = ’ 3 ’ ;<br />
break ;<br />
case 4 : hex = ’ 4 ’ ;<br />
break ;<br />
case 5 : hex = ’ 5 ’ ;<br />
177 break ;<br />
case 6 : hex = ’ 6 ’ ;<br />
break ;<br />
case 7 : hex = ’ 7 ’ ;<br />
break ;<br />
182 case 8 : hex = ’ 8 ’ ;<br />
break ;<br />
case 9 : hex = ’ 9 ’ ;<br />
break ;<br />
case 1 0 : hex = ’A ’ ;<br />
187 break ;<br />
case 1 1 : hex = ’B ’ ;<br />
break ;<br />
case 1 2 : hex = ’C ’ ;<br />
break ;<br />
192 case 1 3 : hex = ’D ’ ;<br />
break ;<br />
case 1 4 : hex = ’E ’ ;<br />
break ;<br />
case 1 5 : hex = ’F ’ ;<br />
197 break ;<br />
default : hex = ’X ’ ;<br />
}<br />
return hex ;<br />
}<br />
Project Report 121
F. Schemas<br />
F.1. Gecko 3, Stand 9. Dezember 2006<br />
122 Christoph Zimmermann
1<br />
1<br />
2<br />
2<br />
3<br />
3<br />
4<br />
4<br />
5<br />
5<br />
6<br />
6<br />
7<br />
7<br />
8<br />
8<br />
F.1. Gecko 3, Stand 9. Dezember 2006<br />
io-bus2<br />
io-bus2.SchDoc<br />
power<br />
power.SCHDOC<br />
A A<br />
fpga<br />
fpga.SCHDOC<br />
FL<br />
ethernet<br />
flash.SchDoc<br />
ethernet.SCHDOC<br />
Flash_D1_[0..15]<br />
Flash_DQ[0..15]<br />
Flash_D0_[0..15]<br />
LED[0..7]<br />
Flash_A[0..23]<br />
Switch[0..3]<br />
TX_EN<br />
Flash_A[0..23]<br />
Flash_A[0..23]<br />
Button[0..2]<br />
TX_CLK<br />
Flash_BYTE<br />
Flash_BYTE<br />
TXD_[0..3]<br />
Flash_WE<br />
Flash_WE<br />
Flash_RP<br />
Flash_RP<br />
RX_CLK<br />
Flash_OE<br />
Flash_OE<br />
TX_EN<br />
RX_DV<br />
Flash_CE0<br />
Flash_CE0<br />
TX_CLK<br />
RX_ER<br />
B TXD_[0..3]<br />
RXD_[0..3]<br />
B<br />
RX_CLK<br />
RAM<br />
RX_DV<br />
CRS<br />
dram.SCHDOC<br />
RX_ER<br />
COL<br />
Dram_D0_[0..15]<br />
Dram_DQ[0..15]<br />
Dram_D0_[0..15]<br />
RXD_[0..3]<br />
Dram_A0_[0..13]<br />
Dram_A[0..13]<br />
Dram_A0_[0..13]<br />
Dram_LDM0<br />
CRS<br />
MDC<br />
Dram_LDM<br />
Dram_UDM0<br />
COL<br />
MDIO<br />
Dram_UDM<br />
Dram_CS0<br />
Dram_CS<br />
Dram_WE0<br />
MDC<br />
Dram_WE<br />
Dram_CAS0<br />
MDIO<br />
Dram_CAS<br />
Dram_RAS0<br />
PWR_DOWN/INT<br />
Dram_RAS<br />
Dram_CKE0<br />
PWR_DOWN/INT<br />
ETH_RESET<br />
Dram_CKE<br />
Dram_CK0<br />
ETH_RESET<br />
Dram_CK<br />
Dram_CK0<br />
Dram_CK<br />
Dram_BA0_1<br />
i2c<br />
Dram_BA1<br />
Dram_BA0_0<br />
i2c.SchDoc<br />
Dram_BA0<br />
Dram_LDQS0<br />
Dram_LDQS<br />
Dram_UDQS0<br />
Vbus_sw<br />
Dram_UDQS<br />
SDA<br />
Dram_D1_[0..15]<br />
Dram_D1_[0..15]<br />
SCL<br />
Dram_A1_[0..13]<br />
Dram_A1_[0..13]<br />
D[0..15]<br />
Dram_LDM1<br />
BUSY/RDYX<br />
usb<br />
Dram_UDM1<br />
INIT_B/WRX<br />
RAM<br />
usb.SCHDOC<br />
Dram_CS1<br />
RDWR_B/WRU<br />
dram.SCHDOC<br />
Dram_WE1<br />
CS_B/RDYU<br />
SDA<br />
C Dram_DQ[0..15]<br />
Dram_CAS1<br />
SCL<br />
C<br />
Dram_A[0..13]<br />
Dram_RAS1<br />
Dram_CKE1<br />
PROG_B<br />
D[0..15]<br />
Dram_LDM<br />
Dram_CK1<br />
CCLK<br />
BUSY/RDYX<br />
Dram_UDM<br />
Dram_CK1<br />
DONE<br />
INIT_B/WRX<br />
Dram_CS<br />
Dram_BA1_1<br />
RDWR_B/WRU<br />
Dram_WE<br />
Dram_BA1_0<br />
CS_B/RDYU<br />
Dram_CAS<br />
Dram_LDQS1<br />
RESET<br />
Dram_RAS<br />
Dram_UDQS1<br />
Dram_CKE<br />
PROG_B<br />
Dram_CK<br />
CCLK<br />
Dram_CK<br />
DONE<br />
Dram_BA1<br />
Dram_BA0<br />
SCLK<br />
Dram_LDQS<br />
MOSI<br />
Dram_UDQS<br />
MISO<br />
SPI_CS_F<br />
TCK<br />
TDI<br />
TDO<br />
TMS<br />
Serial out<br />
Serial in<br />
Power Good<br />
Low Battery<br />
GPIO1_[0..59]<br />
PWM[0..7]<br />
Encoder[0..7]<br />
Sensors[0..5]<br />
SPI_CS_F<br />
MISO<br />
MOSI<br />
SCLK<br />
MD[0..31]<br />
MA[0..25]<br />
DQM[0..3]<br />
RDnWR<br />
nOE<br />
nWE<br />
nCS1<br />
nCS3<br />
nCS4<br />
RDY<br />
DREQ[1..2]<br />
GPIO2[0..34]<br />
SDA_ext<br />
SCL_ext<br />
EXTCLK0<br />
EXTCLK1<br />
Reset<br />
Flash_BYTE<br />
Flash_WE<br />
Flash_RP<br />
Flash_OE<br />
Flash_CE0<br />
Vbus_sw<br />
Vbus<br />
spi-flash<br />
jtag<br />
io-bus<br />
spi-flash.SchDoc<br />
jtag.SchDoc<br />
io-bus.SchDoc<br />
SCLK<br />
MOSI<br />
MISO<br />
D<br />
SPI_CS_F<br />
D<br />
Titel <strong>Gecko3</strong>: SoC Development Platform<br />
Blattgrösse: A3 Nummer:<br />
Revision: 0.7<br />
Datum: 08.12.2006 Zeit: 15:21:29 Blatt von 18<br />
Datei: C:\Documents and Settings\ zimmc5\svn\top.SchDoc<br />
Berne School of Applied Science<br />
School of Engineering and<br />
Information Technology<br />
Quellgasse 21<br />
CH-2501 Biel<br />
1<br />
TCK<br />
TDI<br />
TDO<br />
TMS<br />
Serial out<br />
Serial in<br />
Power Good<br />
Low Battery<br />
GPIO1_[0..59]<br />
PWM[0..7]<br />
Encoder[0..7]<br />
Sensors[0..5]<br />
Vbus<br />
MA[0..25]<br />
MD[0..31]<br />
DQM[0..3]<br />
RDnWR<br />
nOE<br />
nWE<br />
nCS1<br />
nCS3<br />
nCS4<br />
RDY<br />
DREQ[1..2]<br />
GPIO2[0..34]<br />
SCL_ext<br />
SDA_ext<br />
EXTCLK0<br />
EXTCLK1<br />
Reset<br />
FL<br />
flash.SchDoc<br />
switches<br />
switches.SchDoc<br />
Flash_DQ[0..15]<br />
Flash_A[0..23]<br />
Reset<br />
LED[0..7]<br />
Switch[0..3]<br />
Button[0..2]<br />
Abbildung F.1.: Blockdiagramm<br />
Project Report 123
1<br />
1<br />
2<br />
2<br />
3<br />
3<br />
4<br />
4<br />
5<br />
5<br />
6<br />
6<br />
7<br />
2<br />
7<br />
8<br />
8<br />
F. Schemas<br />
FPGA Banks 0,2,4,6<br />
PWR_DOWN/INT<br />
fpga1<br />
fpga1.SchDoc<br />
LED[0..7]<br />
ETH_RESET<br />
D[0..15]<br />
D[0..15] INIT_B/WRX<br />
INIT_B/WRX<br />
Button[0..3]<br />
TX_CLK<br />
Dram_D1_[0..15] Dram_D1_[0..15] BUSY/RDYX<br />
BUSY/RDYX<br />
A A<br />
Dram_A1_[0..13] Dram_A1_[0..13]<br />
Switch[0..3]<br />
RXD_[0..3]<br />
Dram_LDM1 Dram_LDM1<br />
PKTEND<br />
Dram_UDM1 Dram_UDM1<br />
RX_CLK<br />
Dram_CS1<br />
Dram_CS1<br />
Dram_WE1<br />
Dram_WE1<br />
RX_DV<br />
Dram_CAS1 Dram_CAS1<br />
Dram_RAS1 Dram_RAS1<br />
RX_ER<br />
Dram_CKE1 Dram_CKE1<br />
Dram_CK1<br />
Dram_CK1<br />
CRS<br />
Dram_CK1<br />
Dram_CK1<br />
Dram_BA1_1 Dram_BA1_1<br />
COL<br />
Dram_BA1_0 Dram_BA1_0<br />
Dram_LDQS1 Dram_LDQS1<br />
1-Hz-Clock<br />
TX_EN<br />
Dram_UDQS1 Dram_UDQS1<br />
Dram_D0_[0..15] Dram_D0_[0..15]<br />
SSPEXTCLK<br />
TXD_[0..3]<br />
Dram_A0_[0..13] Dram_A0_[0..13]<br />
Dram_LDM0 Dram_LDM0<br />
SSPSYSCLK<br />
MDC<br />
Dram_UDM0 Dram_UDM0<br />
Dram_CS0<br />
Dram_CS0<br />
GPIO2[0..18]<br />
MDIO<br />
Dram_WE0<br />
Dram_WE0<br />
Dram_CAS0 Dram_CAS0<br />
DREQ[1..2]<br />
Dram_RAS0 Dram_RAS0<br />
Dram_CKE0 Dram_CKE0<br />
MD[0..31]<br />
Dram_CK0<br />
Dram_CK0<br />
Dram_CK0<br />
Dram_CK0<br />
MA[0..25]<br />
Dram_BA0_1 Dram_BA0_1<br />
2.5V I/O Bank needed<br />
Dram_BA0_0 Dram_BA0_0<br />
B DQM[0..3]<br />
Dram_LDQS0 Dram_LDQS0<br />
B<br />
Dram_UDQS0 Dram_UDQS0<br />
SDA<br />
Flash_A[0..23] Flash_A[0..23]<br />
Flash_A[0..23]<br />
SCL<br />
SSPSCLK<br />
SSPSFRM<br />
SSPTXD<br />
SSPRXD<br />
Flash_D0_[0..15]<br />
nOE<br />
nWE<br />
PWM[0..7]<br />
fpga2<br />
RDnWR<br />
fpga2.SCHDOC<br />
Encoder[0..7]<br />
Flash_D1_[0..15]<br />
nCS4<br />
D[0..15]<br />
D[0..15]<br />
Sensors[0..5]<br />
Flash_BYTE<br />
CS_B/RDYU<br />
CS_B/RDYU<br />
nCS3<br />
RDWR_B/WRU<br />
RDWR_B/WRU<br />
GPIO1_[0..5]<br />
Flash_WE<br />
EXTCLK0<br />
EXTCLK0<br />
nCS1<br />
EXTCLK1<br />
EXTCLK1<br />
Power Good<br />
Flash_RP<br />
Dram_D1_[0..15] Dram_D1_[0..15]<br />
RDY<br />
Dram_A1_[0..13] Dram_A1_[0..13]<br />
Low Battery<br />
Flash_OE<br />
Dram_LDM1 Dram_LDM1<br />
C FF_RXD<br />
Dram_UDM1 Dram_UDM1<br />
C<br />
Flash_CE0<br />
Dram_CS1<br />
Dram_CS1<br />
FF_CTS<br />
Dram_WE1<br />
Dram_WE1<br />
Dram_CAS1 Dram_CAS1<br />
FF_DCD<br />
Dram_RAS1 Dram_RAS1<br />
Dram_CKE1 Dram_CKE1<br />
FF_DSR<br />
Dram_CK1<br />
Dram_CK1<br />
Serial out<br />
Dram_CK1<br />
Dram_CK1<br />
MOSI<br />
FF_RI<br />
Dram_BA1_1 Dram_BA1_1<br />
Serial in<br />
Dram_BA1_0 Dram_BA1_0<br />
SCLK<br />
FF_RTS<br />
Dram_LDQS1 Dram_LDQS1<br />
Dram_UDQS1 Dram_UDQS1<br />
MISO<br />
FF_DTR<br />
Dram_D0_[0..15] Dram_D0_[0..15]<br />
Dram_A0_[0..13] Dram_A0_[0..13]<br />
SPI_CS_F<br />
FF_TXD<br />
Dram_LDM0 Dram_LDM0<br />
Dram_UDM0 Dram_UDM0<br />
Dram_CS0<br />
Dram_CS0<br />
Dram_WE0<br />
Dram_WE0<br />
Dram_CAS0 Dram_CAS0<br />
Dram_RAS0 Dram_RAS0<br />
Dram_CKE0 Dram_CKE0<br />
fpga-config<br />
Dram_CK0<br />
Dram_CK0<br />
fpga-config.SCHDOC<br />
Dram_CK0<br />
Dram_CK0<br />
PROG_B<br />
PROG_B<br />
DONE<br />
DONE<br />
Dram_BA0_1 Dram_BA0_1<br />
CCLK<br />
CCLK<br />
Dram_BA0_0 Dram_BA0_0<br />
Dram_LDQS0 Dram_LDQS0<br />
Dram_UDQS0 Dram_UDQS0<br />
TMS<br />
TMS<br />
D<br />
TCK<br />
TCK<br />
D<br />
TDO<br />
TDO<br />
FPGA Banks 1,3,5,7<br />
TDI<br />
TDI<br />
Berne School of Applied Science<br />
School of Engineering and<br />
Information Technology<br />
Quellgasse 21<br />
CH-2501 Biel<br />
Titel <strong>Gecko3</strong>: FPGA Parts<br />
Blattgrösse: A3 Nummer:<br />
Revision: 0.7<br />
Datum: 08.12.2006 Zeit: 15:17:53 Blatt von 18<br />
Datei: C:\Documents and Settings\ zimmc5\svn\fpga.SCHDOC<br />
Abbildung F.2.: FPGA Blockdiagramm<br />
124 Christoph Zimmermann
F.1. Gecko 3, Stand 9. Dezember 2006<br />
1<br />
1<br />
2<br />
2<br />
3<br />
3<br />
4<br />
4<br />
5<br />
5<br />
6<br />
6<br />
7<br />
7<br />
8<br />
8<br />
D D<br />
C C<br />
B B<br />
A A<br />
D[0..15]<br />
IN IT_B/WRX<br />
BUSY/RDYX<br />
4.7K<br />
R1_FP1<br />
3.3V<br />
INIT_B/WRX<br />
D[0..15]<br />
3<br />
Berne School of Applied Science<br />
School of Engineering and<br />
Information Technology<br />
Quellgasse 21<br />
CH-2501 Biel<br />
18<br />
<strong>Gecko3</strong>: FPGA First Part<br />
0.7<br />
08.12.2006 15:10:25<br />
C:\Documents and Settings\zimmc5\svn\fpga1.SchDoc<br />
Titel<br />
Blattgrösse: Nummer:<br />
Datum:<br />
Datei:<br />
Revision:<br />
Blatt von<br />
Zeit:<br />
A3<br />
39pF<br />
C1_FP1<br />
39pF<br />
C2_FP1<br />
2.5V<br />
GND<br />
Vref<br />
INIT_B/WRX<br />
BUSY/RDYX<br />
BUSY/RDYX<br />
OE<br />
1<br />
GND<br />
2<br />
OUT<br />
3<br />
VCC<br />
4<br />
50MHz<br />
Q1_FP1<br />
3.3V<br />
GND<br />
IO_L01N_6/VRP_6<br />
AD2<br />
IO_L01P_6/VRN_6<br />
AD1<br />
IO_L02N_6<br />
AB4<br />
IO_L02P_6<br />
AB3<br />
IO_L03N_6/VREF_6<br />
AC2<br />
IO_L03P_6<br />
AC1<br />
IO_L05N_6<br />
AB2<br />
IO_L05P_6<br />
AB1<br />
NC<br />
AA5<br />
IO_L06N_6<br />
Y7<br />
IO_L06P_6<br />
Y6<br />
IO_L07N_6<br />
AA4<br />
IO_L07P_6<br />
AA3<br />
IO_L08N_6<br />
Y5<br />
IO_L08P_6<br />
Y4<br />
IO_L09N_6/VREF_6<br />
AA2<br />
IO_L09P_6<br />
AA1<br />
IO_L10N_6<br />
Y2<br />
IO_L10P_6<br />
Y1<br />
IO_L14N_6<br />
W7<br />
IO_L14P_6<br />
W6<br />
IO_L16P_6<br />
W5<br />
IO_L16N_6<br />
V6<br />
IO_L17N_6<br />
W4<br />
IO_L17P_6/VREF_6<br />
W3<br />
IO_L19N_6<br />
W2<br />
IO_L19P_6<br />
W1<br />
IO_L20N_6<br />
V7<br />
IO_L20P_6<br />
U7<br />
IO_L21N_6<br />
V5<br />
IO_L21P_6<br />
V4<br />
IO_L22N_6<br />
V3<br />
IO_L22P_6<br />
V2<br />
IO_L23N_6<br />
U6<br />
IO_L23P_6<br />
U5<br />
IO_L24N_6/VREF_6<br />
U4<br />
IO_L24P_6<br />
U3<br />
IO_L26N_6<br />
U2<br />
IO_L26P_6<br />
U1<br />
IO_L27N_6<br />
T8<br />
IO_L27P_6<br />
T7<br />
IO_L28N_6<br />
T6<br />
IO_L28P_6<br />
T5<br />
IO_L29N_6<br />
T2<br />
IO_L29P_6<br />
T1<br />
IO_L31N_6<br />
R8<br />
IO_L31P_6<br />
R7<br />
IO_L32N_6<br />
R6<br />
IO_L32P_6<br />
R5<br />
IO_L33N_6<br />
T4<br />
IO_L33P_6<br />
R3<br />
IO_L34N_6/VREF_6<br />
R2<br />
IO_L34P_6<br />
R1<br />
IO_L35N_6<br />
P8<br />
IO_L35P_6<br />
P7<br />
IO_L38N_6<br />
P6<br />
IO_L38P_6<br />
P5<br />
IO_L39N_6<br />
P4<br />
IO_L39P_6<br />
P3<br />
IO_L40N_6<br />
P2<br />
IO_L40P_6/VREF_6<br />
P1<br />
IO_L01N_4/VRP_4<br />
AB22<br />
IO_L01P_4/VRN_4<br />
AC22<br />
IO/VREF_4<br />
AD25<br />
IO_L04N_4<br />
AE24<br />
IO_L04P_4<br />
AF24<br />
IO<br />
AD23<br />
IO_L05N_4<br />
AE23<br />
IO_L05P_4<br />
AF23<br />
IO_L06N_4/VREF_4<br />
AD22<br />
IO_L06P_4<br />
AE22<br />
IO<br />
AF22<br />
IO_L07N_4<br />
AB21<br />
IO_L07P_4<br />
AC21<br />
IO_L08N_4<br />
AD21<br />
IO_L08P_4<br />
AE21<br />
IO<br />
AF21<br />
IO<br />
AA20<br />
IO_L09N_4<br />
AB20<br />
IO_L09P_4<br />
AC20<br />
IO_L10N_4<br />
AE20<br />
IO_L10P_4<br />
AF20<br />
IO_L11N_4<br />
Y19<br />
IO_L11P_4<br />
AA19<br />
IO_L12N_4<br />
AB19<br />
IO_L12P_4<br />
AC19<br />
IO<br />
AD19<br />
IO_L15N_4<br />
AE19<br />
IO_L15P_4<br />
AF19<br />
IO_L16N_4<br />
Y18<br />
IO_L16P_4<br />
AA18<br />
IO_L17N_4<br />
AB18<br />
IO_L17P_4<br />
AC18<br />
IO_L18N_4<br />
AD18<br />
IO_L18P_4<br />
AE18<br />
IO/VREF_4<br />
Y17<br />
IO_L19P_4<br />
AA17<br />
IO_L19N_4<br />
AC17<br />
IO_L22P_4<br />
AB17<br />
IO_L22N_4/VREF_4<br />
AD17<br />
IO_L23N_4<br />
AE17<br />
IO_L23P_4<br />
AF17<br />
IO<br />
W16<br />
IO_L24N_4<br />
Y16<br />
IO_L24P_4<br />
AA16<br />
IO_L25N_4<br />
AB16<br />
IO_L25P_4<br />
AC16<br />
IO_L26N_4<br />
AE16<br />
IO_L26P_4/VREF_4<br />
AF16<br />
IO<br />
W15<br />
IO_L27N_4/DIN/D0<br />
Y15<br />
IO_L27P_4/D1<br />
W14<br />
IO_L28N_4<br />
AA15<br />
IO_L28P_4<br />
AB15<br />
IO<br />
AD15<br />
IO_L29N_4<br />
AE15<br />
IO_L29P_4<br />
AF15<br />
IO_L30N_4/D2<br />
Y14<br />
IO_L30P_4/D3<br />
AA14<br />
IO/VREF_4<br />
AB14<br />
IO_L31N_4/INIT_B<br />
AC14<br />
IO_L31P_4/DOUT/BUSY<br />
AD14<br />
IO_L32N_4/GCLK1<br />
AE14<br />
IO_L32P_4/GCLK0<br />
AF14<br />
IO_L01N_2/VRP_2<br />
C25<br />
IO_L01P_2/VRN_2<br />
C26<br />
IO_L02N_2<br />
E23<br />
IO_L02P_2<br />
E24<br />
IO_L03P_2<br />
D26<br />
IO_L03N_2/VREF_2<br />
D25<br />
IO_L05N_2<br />
E25<br />
IO_L05P_2<br />
E26<br />
NC<br />
F22<br />
IO_L06N_2<br />
G20<br />
IO_L06P_2<br />
G21<br />
IO_L07N_2<br />
F23<br />
IO_L07P_2<br />
F24<br />
IO_L08N_2<br />
G22<br />
IO_L08P_2<br />
G23<br />
IO_L09N_2/VREF_2<br />
F25<br />
IO_L09P_2<br />
F26<br />
IO_L10N_2<br />
G25<br />
IO_L10P_2<br />
G26<br />
IO_L14N_2<br />
H20<br />
IO_L14P_2<br />
H21<br />
IO_L16N_2<br />
H22<br />
IO_L16P_2<br />
J21<br />
IO_L17P_2/VREF_2<br />
H24<br />
IO_L17N_2<br />
H23<br />
IO_L19N_2<br />
H25<br />
IO_L19P_2<br />
H26<br />
IO_L20N_2<br />
J20<br />
IO_L20P_2<br />
K20<br />
IO_L21N_2<br />
J22<br />
IO_L21P_2<br />
J23<br />
IO_L22N_2<br />
J24<br />
IO_L22P_2<br />
J25<br />
IO_L23P_2<br />
K22<br />
IO_L23N_2/VREF_2<br />
K21<br />
IO_L24N_2<br />
K23<br />
IO_L24P_2<br />
K24<br />
IO_L26N_2<br />
K25<br />
IO_L26P_2<br />
K26<br />
IO_L27N_2<br />
L19<br />
IO_L27P_2<br />
L20<br />
IO_L28N_2<br />
L21<br />
IO_L28P_2<br />
L22<br />
IO_L29N_2<br />
L25<br />
IO_L29P_2<br />
L26<br />
IO_L31N_2<br />
M19<br />
IO_L31P_2<br />
M20<br />
IO_L32N_2<br />
M21<br />
IO_L32P_2<br />
M22<br />
IO_L33P_2<br />
M24<br />
IO_L33N_2<br />
L23<br />
IO_L34P_2<br />
M26<br />
IO_L34N_2/VREF_2<br />
M25<br />
IO_L35N_2<br />
N19<br />
IO_L35P_2<br />
N20<br />
IO_L38N_2<br />
N21<br />
IO_L38P_2<br />
N22<br />
IO_L39N_2<br />
N23<br />
IO_L39P_2<br />
N24<br />
IO_L40N_2<br />
N25<br />
IO_L40P_2/VREF_2<br />
N26<br />
IO_L32P_0/GCLK6<br />
A13<br />
IO_L32N_0/GCLK7<br />
B13<br />
IO_L31P_0/VREF_0<br />
C13<br />
IO_L31N_0<br />
D13<br />
IO<br />
E13<br />
IO_L30P_0<br />
F13<br />
IO_L30N_0<br />
G13<br />
IO_L29P_0<br />
A12<br />
IO_L29N_0<br />
B12<br />
IO<br />
C12<br />
IO_L28P_0<br />
E12<br />
IO_L28N_0<br />
F12<br />
IO_L27P_0<br />
H13<br />
IO_L27N_0<br />
G12<br />
IO<br />
H12<br />
IO_L26P_0/VREF_0<br />
A11<br />
IO_L26N_0<br />
B11<br />
IO_L25P_0<br />
D11<br />
IO_L25N_0<br />
E11<br />
IO_L24P_0<br />
F11<br />
IO_L24N_0<br />
G11<br />
IO<br />
H11<br />
IO_L23P_0<br />
A10<br />
IO_L23N_0<br />
B10<br />
IO_L22P_0<br />
C10<br />
IO_L22N_0<br />
D10<br />
IO_L19P_0<br />
E10<br />
IO_L19N_0<br />
F10<br />
IO/VREF_0<br />
G10<br />
IO_L18P_0<br />
B9<br />
IO_L18N_0<br />
C9<br />
IO_L17P_0<br />
D9<br />
IO_L17N_0<br />
E9<br />
IO_L16P_0<br />
F9<br />
IO_L16N_0<br />
G9<br />
IO_L15P_0<br />
A8<br />
IO_L15N_0<br />
B8<br />
IO<br />
C8<br />
IO_L12P_0<br />
D8<br />
IO_L12N_0<br />
E8<br />
IO_L11P_0<br />
F8<br />
IO_L11N_0<br />
G8<br />
IO_L10P_0<br />
A7<br />
IO_L10N_0<br />
B7<br />
IO_L09P_0<br />
D7<br />
IO_L09N_0<br />
E7<br />
IO/VREF_0<br />
F7<br />
IO<br />
A6<br />
IO_L08P_0<br />
B6<br />
IO_L08N_0<br />
C6<br />
IO_L07P_0<br />
D6<br />
IO_L07N_0<br />
E6<br />
IO<br />
A5<br />
IO_L06P_0<br />
B5<br />
IO_L06N_0<br />
C5<br />
IO_L05P_0/VREF_0<br />
A4<br />
IO_L05N_0<br />
B4<br />
IO<br />
C4<br />
IO<br />
A3<br />
IO_L01P_0/VRN_0<br />
D5<br />
IO_L01N_0/VRP_0<br />
E5<br />
IO/VREF_0<br />
B3<br />
BANK 6<br />
BANK 0<br />
BANK 4<br />
BANK 2<br />
XC3S1500-5FG676C<br />
U1A<br />
Dram_D1_[0..15]<br />
Dram_A1_[0..13]<br />
Dram_UDM1<br />
Dram_CS1<br />
Dram_CKE1<br />
Dram_CK1<br />
Dram_CK1<br />
Dram_UDQS1<br />
Dram_D0_[0..15]<br />
Dram_A0_[0..13]<br />
Dram_LDM0<br />
Dram_UDM0<br />
Dram_CKE0<br />
Dram_CK0<br />
Dram_CK0<br />
Dram_BA0_1<br />
Dram_LDQS0<br />
Dram_UDQS0<br />
Dram_CKE0<br />
Dram_UDM0<br />
Dram_UDQS0<br />
Dram_CK0<br />
Dram_CK0<br />
Vref<br />
Vref<br />
Vref<br />
Vref<br />
Vref<br />
Vref<br />
Dram_D0_8<br />
Dram_A0_12<br />
Dram_D0_9<br />
Dram_D0_10<br />
Dram_D0_11<br />
Dram_D0_12<br />
Dram_D0_13<br />
Dram_D0_14<br />
Dram_D0_15<br />
Dra m_D 0_[0..15]<br />
Dram_CS1<br />
Dram_A1_4<br />
Dram_A1_3<br />
Dram_A1_10<br />
Dram_A1_2<br />
Dram_A1_1<br />
Dram_A1_0<br />
Dram_BA0_1<br />
Dra m_A 0_[0..15]<br />
Dra m_D 1_[0..15]<br />
Dra m_A 1_[0..15]<br />
Dram_D0_0<br />
Dram_D0_1<br />
Dram_D0_2<br />
Dram_D0_3<br />
Dram_D0_4<br />
Dram_D0_5<br />
Dram_D0_6<br />
Dram_D0_13<br />
Dram_LDQS0<br />
Dram_A0_13<br />
Dram_LDM0<br />
Dram_A1_5<br />
Dram_A1_6<br />
Dram_A1_7<br />
Dram_A1_8<br />
Dram_A1_9<br />
Dram_A1_11<br />
Dram_A1_12<br />
Dram_CKE1<br />
Dram_CK1<br />
Dram_CK1<br />
Dram_UDM1<br />
Dram_UDQS1<br />
Flash_A[0..23]<br />
Flash_A0<br />
Flash_A1<br />
Flash_A2<br />
Flash_A3<br />
Flash_A4<br />
D6<br />
D7<br />
D4<br />
D5<br />
Abbildung F.3.: Erster Teil des FPGAs<br />
Project Report 125
F. Schemas<br />
1<br />
1<br />
2<br />
2<br />
3<br />
3<br />
4<br />
4<br />
5<br />
5<br />
6<br />
6<br />
7<br />
7<br />
8<br />
8<br />
D D<br />
C C<br />
B B<br />
A A<br />
RDWR_B/WRU<br />
CS_B/RDYU<br />
4<br />
Berne School of Applied Science<br />
School of Engineering and<br />
Information Technology<br />
Quellgasse 21<br />
CH-2501 Biel<br />
18<br />
<strong>Gecko3</strong>: FPGA Second Part<br />
0.7<br />
08.12.2006 15:10:43<br />
C:\Documents and Settings\zimmc5\svn\fpga2.SCHDOC<br />
Titel<br />
Blattgrösse: Nummer:<br />
Datum:<br />
Datei:<br />
Revision:<br />
Blatt von<br />
Zeit:<br />
A3<br />
39pF<br />
C1_FP2<br />
39pF<br />
C2_FP2<br />
2.5V<br />
GND<br />
Vref<br />
D[0..15]<br />
D[0..15]<br />
CS_B/RDYU<br />
RDWR_B/WRU<br />
CS_B/RDYU<br />
RDWR_B/WRU<br />
EXTCLK0<br />
EXTCLK1<br />
IO_L01P_7/VRN_7<br />
F6<br />
IO_L01N_7/VRP_7<br />
F5<br />
IO_L02P_7<br />
E4<br />
IO_L02N_7<br />
E3<br />
IO_L03P_7<br />
D2<br />
IO_L03N_7/VREF_7<br />
D1<br />
IO_L05P_7<br />
G7<br />
IO_L05N_7<br />
G6<br />
IO_L06P_7<br />
E2<br />
IO_L06N_7<br />
E1<br />
IO_L07P_7<br />
F4<br />
IO_L07N_7<br />
F3<br />
IO_L08P_7<br />
G5<br />
IO_L08N_7<br />
G4<br />
IO_L09P_7<br />
F2<br />
IO_L09N_7<br />
F1<br />
IO_L10P_7/VREF_7<br />
H7<br />
IO_L10N_7<br />
H6<br />
IO_L14P_7<br />
G2<br />
IO_L14N_7<br />
G1<br />
IO_L16P_7/VREF_7<br />
H5<br />
IO_L16N_7<br />
J6<br />
IO_L17P_7<br />
H4<br />
IO_L17N_7<br />
H3<br />
IO_L19P_7<br />
H2<br />
IO_L19N_7/VREF_7<br />
H1<br />
IO_L20P_7<br />
J7<br />
IO_L20N_7<br />
K7<br />
IO_L21P_7<br />
J5<br />
IO_L21N_7<br />
J4<br />
IO_L22P_7<br />
J3<br />
IO_L22N_7<br />
J2<br />
IO_L23P_7<br />
K6<br />
IO_L23N_7<br />
K5<br />
IO_L24P_7<br />
K4<br />
IO_L24N_7<br />
K3<br />
IO_L26P_7<br />
K2<br />
IO_L26N_7<br />
K1<br />
IO_L27P_7/VREF_7<br />
L8<br />
IO_L27N_7<br />
L7<br />
IO_L28P_7<br />
L6<br />
IO_L28N_7<br />
L5<br />
IO_L29P_7<br />
L2<br />
IO_L29N_7<br />
L1<br />
IO_L31P_7<br />
M8<br />
IO_L31N_7<br />
M7<br />
IO_L32N_7<br />
M6<br />
IO_L32P_7<br />
M5<br />
IO_L33P_7<br />
L4<br />
IO_L33N_7<br />
M3<br />
IO_L34P_7<br />
M2<br />
IO_L34N_7<br />
M1<br />
IO_L35P_7<br />
N8<br />
IO_L35N_7<br />
N7<br />
IO_L38P_7<br />
N6<br />
IO_L38N_7<br />
N5<br />
IO_L39P_7<br />
N4<br />
IO_L39N_7<br />
N3<br />
IO_L40P_7<br />
N2<br />
IO_L40N_7/VREF_7<br />
N1<br />
IO<br />
AF4<br />
IO_L01P_5/CS_B<br />
AB5<br />
IO_L01N_5/RDWR_B<br />
AC5<br />
IO_L04P_5<br />
AD4<br />
IO_L04N_5<br />
AE4<br />
IO/VREF_5<br />
AF5<br />
IO_L05P_5<br />
AA6<br />
IO_L05N_5<br />
AB6<br />
IO_L06P_5<br />
AD5<br />
IO_L06N_5<br />
AE5<br />
IO_L07P_5<br />
AC6<br />
IO_L07N_5<br />
AD6<br />
IO_L08P_5<br />
AE6<br />
IO_L08N_5<br />
AF6<br />
IO<br />
AA7<br />
IO_L09P_5<br />
AB7<br />
IO_L09N_5<br />
AC7<br />
IO_L10P_5/VRN_5<br />
AE7<br />
IO_L10N_5/VRP_5<br />
AF7<br />
IO<br />
Y8<br />
IO_L11P_5<br />
AA8<br />
IO_L11N_5/VREF_5<br />
AB8<br />
IO_L12P_5<br />
AC8<br />
IO_L12N_5<br />
AD8<br />
IO_L15P_5<br />
AE8<br />
IO_L15N_5<br />
AF8<br />
IO_L16P_5<br />
Y9<br />
IO_L16N_5<br />
AA9<br />
IO<br />
AB9<br />
IO<br />
AC9<br />
IO_L18P_5<br />
AD9<br />
IO_L18N_5<br />
AE9<br />
IO_L19P_5/VREF_5<br />
Y10<br />
IO_L19N_5<br />
AA10<br />
IO_L22P_5<br />
AB10<br />
IO_L22N_5<br />
AC10<br />
IO<br />
AD10<br />
IO_L23P_5<br />
AE10<br />
IO_L23N_5<br />
AF10<br />
IO_L24P_5<br />
W11<br />
IO_L24N_5<br />
Y11<br />
IO_L25P_5<br />
AA11<br />
IO_L25N_5<br />
AB11<br />
IO<br />
AC11<br />
IO_L26P_5<br />
AE11<br />
IO_L26N_5<br />
AF11<br />
IO_L27P_5<br />
W12<br />
IO_L27N_5/VREF_5<br />
Y12<br />
IO_L28P_5/D7<br />
AA12<br />
IO_L28N_5/D6<br />
AB12<br />
IO<br />
AD12<br />
IO_L29P_5/VREF_5<br />
AE12<br />
IO_L29N_5<br />
AF12<br />
IO_L30P_5<br />
W13<br />
IO_L30N_5<br />
Y13<br />
IO<br />
AA13<br />
IO_L31P_5/D5<br />
AB13<br />
IO_L31N_5/D4<br />
AC13<br />
IO_L32P_5/GCLK2<br />
AD13<br />
IO_L32N_5/GCLK3<br />
AE13<br />
IO/VREF_5<br />
AF13<br />
IO_L40N_3/VREF_3<br />
P26<br />
IO_L40P_3<br />
P25<br />
IO_L39N_3<br />
P24<br />
IO_L39P_3<br />
P23<br />
IO_L38N_3<br />
P22<br />
IO_L38P_3<br />
P21<br />
IO_L35N_3<br />
P20<br />
IO_L35P_3<br />
P19<br />
IO_L34N_3<br />
R26<br />
IO_L34P_3/VREF_3<br />
R25<br />
IO_L33N_3<br />
R24<br />
IO_L33P_3<br />
T23<br />
IO_L32N_3<br />
R22<br />
IO_L32P_3<br />
R21<br />
IO_L31N_3<br />
R20<br />
IO_L31P_3<br />
R19<br />
IO_L29N_3<br />
T26<br />
IO_L29P_3<br />
T25<br />
IO_L28N_3<br />
T22<br />
IO_L28P_3<br />
T21<br />
IO_L27N_3<br />
T20<br />
IO_L27P_3<br />
T19<br />
IO_L26N_3<br />
U26<br />
IO_L26P_3<br />
U25<br />
IO_L24N_3<br />
U24<br />
IO_L24P_3<br />
U23<br />
IO_L23N_3<br />
U22<br />
IO_L23P_3/VREF_3<br />
U21<br />
IO_L22N_3<br />
V25<br />
IO_L22P_3<br />
V24<br />
IO_L21N_3<br />
V23<br />
IO_L21P_3<br />
V22<br />
IO_L20N_3<br />
U20<br />
IO_L20P_3<br />
V20<br />
IO_L19N_3<br />
W26<br />
IO_L19P_3<br />
W25<br />
IO_L17N_3<br />
W24<br />
IO_L17P_3/VREF_3<br />
W23<br />
IO_L16N_3<br />
V21<br />
IO_L16P_3<br />
W22<br />
IO_L14N_3<br />
Y26<br />
IO_L14P_3<br />
Y25<br />
IO_L10N_3<br />
W21<br />
IO_L10P_3<br />
W20<br />
IO_L09N_3<br />
AA26<br />
IO_L09P_3/VREF_3<br />
AA25<br />
IO_L08N_3<br />
Y23<br />
IO_L08P_3<br />
Y22<br />
IO_L07N_3<br />
AA24<br />
IO_L07P_3<br />
AA23<br />
IO_L06N_3<br />
AB26<br />
IO_L06P_3<br />
AB25<br />
IO_L05N_3<br />
Y21<br />
IO_L05P_3<br />
Y20<br />
IO_L03N_3<br />
AC26<br />
IO_L03P_3<br />
AC25<br />
IO_L02N_3/VREF_3<br />
AB24<br />
IO_L02P_3<br />
AB23<br />
IO_L01N_3/VRP_3<br />
AA22<br />
IO_L01P_3/VRN_3<br />
AA21<br />
IO<br />
A14<br />
IO_L32N_1/GCLK5<br />
B14<br />
IO_L32P_1/GCLK4<br />
C14<br />
IO_L31N_1/VREF_1<br />
D14<br />
IO_L31P_1<br />
E14<br />
IO<br />
F14<br />
IO_L30N_1<br />
G14<br />
IO_L30P_1<br />
H14<br />
IO_L29N_1<br />
A15<br />
IO_L29P_1<br />
B15<br />
IO/VREF_1<br />
C15<br />
IO_L28N_1<br />
E15<br />
IO_L28P_1<br />
F15<br />
IO_L27N_1<br />
G15<br />
IO_L27P_1<br />
H15<br />
IO_L26N_1<br />
A16<br />
IO_L26P_1<br />
B16<br />
IO<br />
D16<br />
IO_L25N_1<br />
E16<br />
IO_L25P_1<br />
F16<br />
IO_L24N_1<br />
G16<br />
IO_L24P_1<br />
H16<br />
IO_L23N_1<br />
A17<br />
IO_L23P_1<br />
B17<br />
IO/VREF_1<br />
C17<br />
IO_L22N_1<br />
D17<br />
IO_L22P_1<br />
E17<br />
IO_L19N_1<br />
F17<br />
IO_L19P_1<br />
G17<br />
IO_L18N_1<br />
B18<br />
IO_L18P_1<br />
C18<br />
IO/VREF_1<br />
D18<br />
IO<br />
E18<br />
IO_L16N_1<br />
F18<br />
IO_L16P_1<br />
G18<br />
IO_L15N_1<br />
A19<br />
IO_L15P_1<br />
B19<br />
IO_L12N_1<br />
C19<br />
IO_L12P_1<br />
D19<br />
IO_L11N_1<br />
E19<br />
IO_L11P_1<br />
F19<br />
IO<br />
G19<br />
IO_L10N_1/VREF_1<br />
A20<br />
IO_L10P_1<br />
B20<br />
IO_L09N_1<br />
D20<br />
IO_L09P_1<br />
E20<br />
IO<br />
F20<br />
IO_L08N_1<br />
A21<br />
IO_L08P_1<br />
B21<br />
IO_L07N_1<br />
C21<br />
IO_L07P_1<br />
D21<br />
IO_L06N_1/VREF_1<br />
B22<br />
IO_L06P_1<br />
C22<br />
IO_L05N_1<br />
E21<br />
IO_L05P_1<br />
F21<br />
IO<br />
A22<br />
IO_L04N_1<br />
B23<br />
IO_L04P_1<br />
C23<br />
IO_L01N_1/VRP_1<br />
D22<br />
IO_L01P_1/VRN_1<br />
E22<br />
IO<br />
A23<br />
BANK 7<br />
BANK 1<br />
BANK 5<br />
BANK 3<br />
XC3S1500-5FG676C<br />
U1B<br />
Dram_D1_[0..15]<br />
Dram_A1_[0..13]<br />
Dram_LDM1<br />
Dram_WE1<br />
Dram_CAS1<br />
Dram_RAS1<br />
Dram_BA1_1<br />
Dram_BA1_0<br />
Dram_CS0<br />
Dram_WE0<br />
Dram_CAS0<br />
Dram_RAS0<br />
Dram_BA0_0<br />
Dram_LDQS1<br />
2.5V I/O Bank needed<br />
Vref<br />
Vref<br />
Vref<br />
Vref<br />
Vref<br />
Vref<br />
Dram_A0_5<br />
Dram_A0_6<br />
Dram_A0_7<br />
Dram_A0_8<br />
Dram_A0_9<br />
Dram_A0_11<br />
Dram_A0_[0..13]<br />
Dram_D1_0<br />
Dram_D1_1<br />
Dram_D1_2<br />
Dram_D1_3<br />
Dram_D1_4<br />
Dram_D1_5<br />
Dram_D1_6<br />
Dram_D1_13<br />
Dram_LDQS1<br />
Dram_A1_13<br />
Dram_CAS1<br />
Dram_BA1_1<br />
Dram_RAS1<br />
Dram_WE1<br />
Dram_LDM1<br />
Dram_D0_[0..15] Dra m_D 0_[0..15]<br />
Dra m_A 0_[0..15]<br />
Dra m_D 1_[0..15]<br />
Dra m_A 1_[0..15]<br />
Dram_WE0<br />
Dram_BA0_0<br />
Dram_CAS0<br />
Dram_RAS0<br />
Dram_CS0<br />
Dram_BA1_0<br />
Dram_A0_0<br />
Dram_A0_1<br />
Dram_A0_2<br />
Dram_A0_10<br />
Dram_A0_3<br />
Dram_A0_4<br />
Dram_D1_8<br />
Dram_D1_9<br />
Dram_D1_10<br />
Dram_D1_11<br />
Dram_D1_12<br />
Dram_D1_13<br />
Dram_D1_14<br />
Dram_D1_15<br />
D0<br />
D1<br />
D2<br />
D3<br />
Abbildung F.4.: Zweiter Teil des FPGAs<br />
126 Christoph Zimmermann
1<br />
1<br />
2<br />
2<br />
3<br />
3<br />
4<br />
4<br />
5<br />
5<br />
6<br />
6<br />
7<br />
7<br />
8<br />
8<br />
F.1. Gecko 3, Stand 9. Dezember 2006<br />
3.3V<br />
C125_CNF<br />
10uF<br />
C77_CNF<br />
Requrired to avoid back supplying of the Regulator<br />
C67_CNF 100nF<br />
2.5V<br />
A 3.3V 2.5V<br />
A<br />
100nF<br />
C57_CNF<br />
R7_CNF<br />
120<br />
on 3.3V I/O Banks the 1nF Capacitor could be removed if there is no space<br />
Bank 4 &5 must use 3.3V because they are connected to the EZ-USB<br />
C47_CNF 100nF<br />
GND<br />
1.2V<br />
GND<br />
G24<br />
2.5V<br />
VCCO_2<br />
3.3V<br />
J19<br />
VCCO_2<br />
K19<br />
GND<br />
VCCO_2<br />
L18<br />
R3_CNF<br />
VCCO_2<br />
L24<br />
330<br />
VCCO_2<br />
M18<br />
B VCCO_2<br />
C36_CNF C46_CNF C56_CNF C66_CNF C76_CNF C124_CNF N17<br />
B<br />
VCCO_2<br />
R1_CNF 68<br />
100nF 100nF 100nF 100nF 100nF 10uF<br />
N18<br />
AD26<br />
CCLK<br />
VCCO_2<br />
CCLK<br />
CCLK<br />
AC24<br />
DONE<br />
DONE<br />
DONE<br />
P18<br />
VCCO_3<br />
3.3V<br />
GND<br />
P17<br />
D3<br />
R2_CNF<br />
PROG_B<br />
VCCO_3<br />
PROG_B<br />
PROG_B<br />
R18<br />
VCCO_3<br />
68<br />
C5_CNF<br />
T24<br />
AE3<br />
VCCO_3<br />
M0<br />
GND<br />
T18<br />
AC3<br />
100nF<br />
VCCO_3<br />
M1<br />
2.5V<br />
U19<br />
AF3<br />
Configuration Mode: Slave Parallel<br />
VCCO_3<br />
M2<br />
V19<br />
VCCO_3<br />
C3_CNF<br />
Y24<br />
C1 TD I<br />
VCCO_3<br />
TDI<br />
TDI<br />
D24 TD O<br />
100nF<br />
TDO<br />
TDO<br />
V14<br />
B24 TCK<br />
VCCO_4<br />
TCK<br />
TCK<br />
C7_CNF 3.3V<br />
U14<br />
A24 TMS<br />
VCCO_4<br />
TMS<br />
TMS<br />
V15<br />
100nF<br />
VCCO_4<br />
C11_CNF<br />
AD16<br />
C2<br />
VCCO_4<br />
HSWAP_EN<br />
2.5V<br />
V16<br />
Internal pull-up's deactivated during configuration<br />
C1_CNF<br />
100nF<br />
VCCO_4<br />
W17<br />
VCCO_4<br />
W18<br />
100nF<br />
VCCO_4<br />
C13_CNF<br />
AD20<br />
U1C<br />
VCCO_4<br />
C9_CNF<br />
100nF<br />
V13<br />
XC3S1500-5FG676C<br />
100nF<br />
VCCO_5<br />
C15_CNF 3.3V<br />
U13<br />
AF26<br />
VCCO_5<br />
GND<br />
V12<br />
AF1<br />
C121_CNF<br />
100nF<br />
VCCO_5<br />
GND<br />
C21_CNF<br />
AD11<br />
AE25<br />
VCCO_5<br />
GND<br />
V11<br />
AE2<br />
C17_CNF<br />
100nF<br />
VCCO_5<br />
GND<br />
W10<br />
AD24<br />
10uF<br />
VCCO_5<br />
GND<br />
C<br />
W9<br />
AD3<br />
C<br />
GND 100nF<br />
VCCO_5<br />
GND<br />
C23_CNF<br />
AD7<br />
AC23<br />
VCCO_5<br />
GND<br />
C19_CNF<br />
AC15<br />
100nF<br />
GND<br />
P9<br />
AC12<br />
100nF<br />
VCCO_6<br />
GND<br />
C25_CNF<br />
P10<br />
AC4<br />
VCCO_6<br />
GND<br />
R9<br />
U16<br />
C122_CNF<br />
100nF<br />
VCCO_6<br />
GND<br />
T3<br />
U15<br />
VCCO_6<br />
GND<br />
T9<br />
U12<br />
VCCO_6<br />
GND<br />
C27_CNF<br />
U8<br />
U11<br />
10uF<br />
VCCO_6<br />
GND<br />
V8<br />
T17<br />
GND 100nF<br />
VCCO_6<br />
GND<br />
Y3<br />
T16<br />
VCCO_6<br />
GND<br />
C29_CNF<br />
T15<br />
GND<br />
N9<br />
T14<br />
100nF<br />
VCCO_7<br />
GND<br />
N10<br />
T13<br />
VCCO_7<br />
GND<br />
M9<br />
T12<br />
VCCO_7<br />
GND<br />
C123_CNF<br />
L3<br />
T11<br />
VCCO_7<br />
GND<br />
L9<br />
T10<br />
VCCO_7<br />
GND<br />
K8<br />
R23<br />
10uF<br />
VCCO_7<br />
GND<br />
J8<br />
R17<br />
VCCO_7<br />
GND<br />
GND<br />
G3<br />
R16<br />
VCCO_7<br />
GND<br />
D D<br />
2.5V 2.5V<br />
GND<br />
Titel <strong>Gecko3</strong>: FPGA Configuration and Decoupling<br />
Blattgrösse: A3 Nummer:<br />
Revision: 0.8<br />
Datum: 08.12.2006 Zeit: 15:06:37 Blatt von 18<br />
Datei: C:\Documents and Settings\ zimmc5\svn\fpga-config.SCHDOC<br />
Berne School of Applied Science<br />
School of Engineering and<br />
Information Technology<br />
Quellgasse 21<br />
CH-2501 Biel<br />
5<br />
1nF<br />
C35_CNF<br />
100nF<br />
C40_CNF<br />
1nF<br />
C45_CNF<br />
100nF<br />
C50_CNF<br />
1nF<br />
C55_CNF<br />
100nF<br />
C60_CNF<br />
1nF<br />
C65_CNF<br />
100nF<br />
C70_CNF<br />
1nF<br />
C75_CNF<br />
100nF<br />
C80_CNF<br />
1nF<br />
C82_CNF<br />
100nF<br />
C84_CNF<br />
GND<br />
1nF<br />
C33_CNF<br />
100nF<br />
C38_CNF<br />
1nF<br />
C43_CNF<br />
100nF<br />
C48_CNF<br />
1nF<br />
C53_CNF<br />
100nF<br />
C58_CNF<br />
1nF<br />
C63_CNF<br />
100nF<br />
C68_CNF<br />
1nF<br />
C73_CNF<br />
100nF<br />
C78_CNF<br />
1nF<br />
C86_CNF<br />
100nF<br />
C88_CNF<br />
1nF<br />
C94_CNF<br />
100nF<br />
C96_CNF<br />
1nF<br />
C102_CNF<br />
100nF<br />
C104_CNF<br />
1nF<br />
C108_CNF<br />
100nF<br />
C110_CNF<br />
1nF<br />
C114_CNF<br />
100nF<br />
C116_CNF<br />
1nF<br />
C90_CNF<br />
100nF<br />
C92_CNF<br />
1nF<br />
C98_CNF<br />
100nF<br />
C100_CNF<br />
1nF<br />
C105_CNF<br />
100nF<br />
C106_CNF<br />
1nF<br />
C111_CNF<br />
100nF<br />
C112_CNF<br />
1nF<br />
C117_CNF<br />
100nF<br />
C118_CNF<br />
1nF<br />
C119_CNF<br />
100nF<br />
C120_CNF<br />
1nF<br />
C34_CNF<br />
100nF<br />
C39_CNF<br />
1nF<br />
C44_CNF<br />
100nF<br />
C49_CNF<br />
1nF<br />
C54_CNF<br />
100nF<br />
C59_CNF<br />
1nF<br />
C64_CNF<br />
100nF<br />
C69_CNF<br />
1nF<br />
C74_CNF<br />
100nF<br />
C79_CNF<br />
1nF<br />
C81_CNF<br />
100nF<br />
C83_CNF<br />
1nF<br />
C89_CNF<br />
100nF<br />
C91_CNF<br />
1nF<br />
C97_CNF<br />
100nF<br />
C99_CNF<br />
100nF<br />
C37_CNF<br />
100nF<br />
GND<br />
10uF<br />
C129_CNF<br />
100nF<br />
C87_CNF<br />
100nF<br />
C95_CNF<br />
100nF<br />
C103_CNF<br />
100nF<br />
C109_CNF<br />
100nF<br />
C115_CNF<br />
10uF<br />
C128_CNF<br />
10uF<br />
C130_CNF<br />
10uF<br />
C127_CNF<br />
3.3V<br />
1.2V<br />
10uF<br />
C126_CNF<br />
A1<br />
A26<br />
B2<br />
B25<br />
C3<br />
C24<br />
D4<br />
D12<br />
D15<br />
D23<br />
K11<br />
K12<br />
K15<br />
K16<br />
L10<br />
L11<br />
L12<br />
L13<br />
L14<br />
L15<br />
L16<br />
L17<br />
M4<br />
M10<br />
M11<br />
M12<br />
M13<br />
M14<br />
M15<br />
M16<br />
M17<br />
M23<br />
N11<br />
N12<br />
N13<br />
N14<br />
N15<br />
N16<br />
P11<br />
P12<br />
P13<br />
P14<br />
P15<br />
P16<br />
R4<br />
R10<br />
R11<br />
R12<br />
R13<br />
R14<br />
R15<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
VCCO_1<br />
VCCO_1<br />
VCCO_1<br />
VCCO_1<br />
VCCO_1<br />
VCCO_1<br />
VCCO_1<br />
VCCO_1<br />
VCCO_0<br />
VCCO_0<br />
VCCO_0<br />
VCCO_0<br />
VCCO_0<br />
VCCO_0<br />
VCCO_0<br />
VCCO_0<br />
VCCAUX<br />
VCCAUX<br />
VCCAUX<br />
VCCAUX<br />
VCCAUX<br />
VCCAUX<br />
VCCAUX<br />
VCCAUX<br />
VCCAUX<br />
VCCAUX<br />
VCCAUX<br />
VCCAUX<br />
VCCAUX<br />
VCCAUX<br />
VCCAUX<br />
VCCAUX<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
VCCINT<br />
C20<br />
H18<br />
H17<br />
J16<br />
C16<br />
J15<br />
K14<br />
J14<br />
C7<br />
H9<br />
H10<br />
J11<br />
C11<br />
J12<br />
K13<br />
J13<br />
A2<br />
A9<br />
A18<br />
A25<br />
B1<br />
B26<br />
J1<br />
J26<br />
V1<br />
V26<br />
AE1<br />
AE26<br />
AF2<br />
AF9<br />
AF18<br />
AF25<br />
H8<br />
H19<br />
J9<br />
J10<br />
J17<br />
J18<br />
K9<br />
K10<br />
K17<br />
K18<br />
U9<br />
U10<br />
U17<br />
U18<br />
V9<br />
V10<br />
V17<br />
V18<br />
W8<br />
W19<br />
GND<br />
GND<br />
Abbildung F.5.: FPGA Konfiguration und Spannungsversorgung<br />
Project Report 127
1<br />
1<br />
2<br />
2<br />
3<br />
3<br />
4<br />
4<br />
5<br />
5<br />
6<br />
6<br />
7<br />
7<br />
8<br />
8<br />
F. Schemas<br />
PCB Rule<br />
Dram_CK<br />
PCB Rule<br />
Dram_CK<br />
PCB Rule<br />
Dram_CKE<br />
PCB Rule<br />
A A<br />
Dram_RAS PCB Rule<br />
Dram_CAS<br />
PCB Rule<br />
Dram_WE<br />
PCB Rule<br />
Dram_CS<br />
Dram_LDM<br />
Dram_UDM<br />
PCB Rule<br />
PCB Rule<br />
PCB Rule<br />
PCB Rule<br />
PCB Rule<br />
Dram_LDQS<br />
Dram_UDQS<br />
Dram_BA0<br />
PCB Rule<br />
Dram_DQ[0..15]<br />
2.5V<br />
Dram_A[0..13]<br />
Dram_A[0..13]<br />
B B<br />
PCB Rule<br />
i PCB Rule<br />
C7<br />
Vref<br />
C1<br />
39pF<br />
C2<br />
2.5V<br />
39pF<br />
GND<br />
C C<br />
D D<br />
U1<br />
DDR-SDRAM<br />
10uF<br />
C6<br />
100nF<br />
C5<br />
100nF GND<br />
VDDQ<br />
VDDQ<br />
VDDQ<br />
VDDQ<br />
VDDQ<br />
VDD<br />
VDD<br />
VDD<br />
3<br />
9<br />
15<br />
55<br />
61<br />
1<br />
18<br />
33<br />
DQ0<br />
DQ1<br />
DQ2<br />
DQ3<br />
DQ4<br />
DQ5<br />
DQ6<br />
DQ7<br />
2<br />
4<br />
5<br />
7<br />
8<br />
34<br />
48<br />
66<br />
6<br />
12<br />
52<br />
58<br />
64<br />
14<br />
19<br />
25<br />
43<br />
50<br />
53<br />
VSS<br />
VSS<br />
VSS<br />
VSSQ<br />
VSSQ<br />
VSSQ<br />
VSSQ<br />
VSSQ<br />
NC<br />
NC<br />
NC<br />
NC<br />
NC<br />
NC<br />
RAS<br />
CAS<br />
WE<br />
CS<br />
CK<br />
CK<br />
CKE<br />
VREF<br />
23<br />
22<br />
21<br />
24<br />
45R1<br />
46<br />
44<br />
49<br />
5<br />
6<br />
7<br />
8<br />
4x27<br />
RA1<br />
1<br />
2<br />
3<br />
4<br />
Place same Vref decoupling<br />
near the FPGA Vref pin<br />
Rule: Supply Nets [Voltage = 1.250]<br />
Dram_BA1<br />
PCB Rule<br />
Rule: Supply Nets [Voltage = 2.500]<br />
Dram_DQ[0..15]<br />
29<br />
30<br />
31<br />
32<br />
35<br />
36<br />
37<br />
38<br />
39<br />
40<br />
28<br />
41<br />
42<br />
17<br />
26<br />
27<br />
20<br />
47<br />
A0<br />
A1<br />
A2<br />
A3<br />
A4<br />
A5<br />
A6<br />
A7<br />
A8<br />
A9<br />
A10/AP<br />
A11<br />
A12<br />
A13<br />
BA0<br />
BA1<br />
LDM<br />
UDM<br />
2.5V<br />
i PCB Rule<br />
100nF<br />
C4<br />
100nF<br />
C3<br />
DQ8<br />
DQ9<br />
DQ10<br />
DQ11<br />
DQ12<br />
DQ13<br />
DQ14<br />
DQ15<br />
LDQS<br />
UDQS<br />
10<br />
11<br />
13<br />
54<br />
56<br />
57<br />
59<br />
60<br />
62<br />
63<br />
65<br />
16<br />
51<br />
GND<br />
i PCB Rule<br />
Rule: Supply Nets [Voltage = 0.000]<br />
i<br />
i<br />
6<br />
Rule: Signal Stimulus [Kind - Periodic Pulse Level - Low Start Time = 0.000 Stop Time = 1.800n Period Time = 3.600n]<br />
Overshoot - Falling Edge [Max = 300.0m]<br />
Overshoot - Rising Edge [Max = 300.0m]<br />
Undershoot - Falling Edge [Max = 300.0m]<br />
Undershoot - Rising Edge [Max = 300.0m]<br />
Impedance Constraint [Min = 40.00 Max = 70.00 ]<br />
Maximum Via Count Constraint [Max Count = 2]<br />
Matched Net Lengths [Tolerance = 3.6mm Style - 90 Degrees Amplitude = 5.08mm Gap = 0.508mm ]<br />
4.7K<br />
5<br />
6<br />
7<br />
8<br />
5<br />
6<br />
7<br />
8<br />
5<br />
6<br />
7<br />
8<br />
4x27<br />
RA4<br />
4x27<br />
RA2<br />
4x27<br />
RA3<br />
1<br />
2<br />
3<br />
4<br />
1<br />
2<br />
3<br />
4<br />
1<br />
2<br />
3<br />
4<br />
1<br />
8<br />
2<br />
7<br />
3<br />
6<br />
4 5<br />
1<br />
8<br />
2<br />
7<br />
3<br />
6<br />
4 5<br />
1<br />
8<br />
2<br />
7<br />
3<br />
6<br />
4 5<br />
1<br />
8<br />
2<br />
7<br />
3<br />
6<br />
4 5<br />
1<br />
8<br />
2<br />
7<br />
3<br />
6<br />
4 5<br />
1<br />
2<br />
3<br />
4<br />
Dram_BA1<br />
Dram_BA0<br />
Dram_CS<br />
Dram_RAS<br />
Dram_CAS<br />
Dram_WE<br />
Dram_LDM<br />
Dram_A13<br />
Dram_LDQS<br />
Dram_CKE<br />
Dram_A12<br />
Dram_A11<br />
Dram_A9<br />
Dram_DQ12<br />
Dram_DQ13<br />
Dram_DQ14<br />
Dram_DQ15<br />
Dram_DQ8<br />
Dram_DQ9<br />
Dram_DQ10<br />
Dram_DQ11<br />
Dram_UDM<br />
Dram_UDQS<br />
Dram_CK<br />
Dram_CK<br />
Dram_DQ0<br />
Dram_DQ1<br />
Dram_DQ2<br />
Dram_DQ3<br />
Dram_DQ4<br />
Dram_DQ5<br />
Dram_DQ6<br />
Dram_DQ7<br />
RA5<br />
4x27<br />
RA6<br />
4x27<br />
RA7<br />
4x27<br />
RA8<br />
4x27<br />
RA9<br />
4x27<br />
5<br />
6<br />
7<br />
8<br />
5<br />
6<br />
7<br />
8<br />
4x27<br />
RA10<br />
4x27<br />
RA11<br />
1<br />
2<br />
3<br />
4<br />
remove these no-ERC after wirering the ram!!!<br />
Titel <strong>Gecko3</strong>: DDR SDRAM<br />
Blattgrösse: A3 Nummer:<br />
Revision: 0.8<br />
Datum: 08.12.2006 Zeit: 15:14:54 Blatt von 18<br />
Datei: C:\Documents and Settings\ zimmc5\svn\dram.SCHDOC<br />
Berne School of Applied Science<br />
School of Engineering and<br />
Information Technology<br />
Quellgasse 21<br />
CH-2501 Biel<br />
i<br />
i<br />
i<br />
i<br />
i<br />
i<br />
i<br />
i<br />
i<br />
i<br />
i<br />
i<br />
i<br />
Dram_A4<br />
Dram_A3<br />
Dram_A10<br />
Dram_A0<br />
Dram_A1<br />
Dram_A2<br />
Dram_A5<br />
Dram_A6<br />
Dram_A7<br />
Dram_A8<br />
Abbildung F.6.: DDR SDRAM<br />
128 Christoph Zimmermann
F.1. Gecko 3, Stand 9. Dezember 2006<br />
1<br />
2<br />
3<br />
4<br />
A A<br />
Disables Flash during FPGA configuration<br />
3.3V<br />
Flash_OE<br />
Flash_OE<br />
Flash_A[0..23]<br />
Flash_A[0..23]<br />
B B<br />
Flash_A0 32<br />
Flash_DQ[0..15]<br />
A0<br />
Flash_DQ[0..15]<br />
Flash_A1 28<br />
A1<br />
Flash_A2 27<br />
A2<br />
Flash_A3 26<br />
53<br />
A3<br />
STS<br />
Flash_A4 25<br />
A4<br />
Flash_A5 24<br />
33 Flash_DQ0<br />
A5<br />
DQ0<br />
Flash_A6 23<br />
35 Flash_DQ1<br />
A6<br />
DQ1<br />
Flash_A7 22<br />
38 Flash_DQ2<br />
A7<br />
DQ2<br />
Flash_A8 20<br />
40 Flash_DQ3<br />
A8<br />
DQ3<br />
Flash_A9 19<br />
44 Flash_DQ4<br />
A9<br />
DQ4<br />
Flash_A10 18<br />
46 Flash_DQ5<br />
A10<br />
DQ5<br />
Flash_A11 17<br />
49 Flash_DQ6<br />
A11<br />
DQ6<br />
Flash_A12 13<br />
51 Flash_DQ7<br />
A12<br />
DQ7<br />
Flash_A13 12<br />
A13<br />
Flash_A14 11<br />
34 Flash_DQ8<br />
A14<br />
DQ8<br />
Flash_A15 10<br />
36 Flash_DQ9<br />
A15<br />
DQ9<br />
Flash_A16 8<br />
39 Flash_DQ10<br />
A16<br />
DQ10<br />
Flash_A17 7<br />
41 Flash_DQ11<br />
C A17<br />
DQ11<br />
C<br />
Flash_A18 6<br />
45 Flash_DQ12<br />
A18<br />
DQ12<br />
Flash_A19 5<br />
47 Flash_DQ13<br />
A19<br />
DQ13<br />
Flash_A20 4<br />
50 Flash_DQ14<br />
A20<br />
DQ14<br />
Flash_A21 3<br />
52 Flash_DQ15<br />
A21<br />
DQ15<br />
Flash_A22 1<br />
A22<br />
Flash_A23 30<br />
A23<br />
14<br />
2<br />
29<br />
21<br />
42<br />
48<br />
56<br />
CE0<br />
CE1<br />
CE2<br />
GND<br />
GND<br />
GND<br />
NC<br />
OE<br />
RP<br />
WE<br />
BYTE<br />
Vpen<br />
VCC<br />
VCC<br />
VCCQ<br />
54<br />
16<br />
55<br />
31<br />
15<br />
9<br />
37<br />
43<br />
R3<br />
C8<br />
C9<br />
C10<br />
4.7K<br />
100nF<br />
100nF<br />
100nF<br />
GND<br />
Flash_BYTE<br />
Flash_WE<br />
Flash_RP<br />
Flash_BYTE<br />
Flash_WE<br />
Flash_RP<br />
R4<br />
4.7K<br />
Flash_CE0<br />
Flash_CE0<br />
3.3V<br />
R2<br />
GND GND<br />
U2<br />
JS28F128J3D-75<br />
4.7K<br />
D D<br />
Titel<br />
<strong>Gecko3</strong>: NOR Flash<br />
Blattgrösse: A4 Nummer:<br />
Revision: 0.7<br />
Datum: 08.12.2006 Zeit: 14:57:43 Blatt 7 von<br />
Datei: C:\Documents and Settings\zimmc5\svn\flash.SchDoc<br />
18<br />
Berne School of Applied Science<br />
School of Engineering and<br />
Information Technology<br />
Quellgasse 21<br />
CH-2501 Biel<br />
1<br />
2<br />
3<br />
4<br />
Abbildung F.7.: paralleles NOR Flash<br />
Project Report 129
F. Schemas<br />
1<br />
2<br />
3<br />
4<br />
C8_USB C10_USB C12_USB<br />
Vbus_sw<br />
CTL<br />
C7_USB C9_USB C11_USB 3.3V<br />
A A<br />
2<br />
4<br />
GND STAT<br />
3.3V<br />
3.3V<br />
C13_USB<br />
C5_USB<br />
GND 100nF 1nF 100nF 100nF 100nF 100nF<br />
C6_USB<br />
GND<br />
1<br />
3<br />
U2_USB<br />
IN<br />
LTC4411<br />
OUT<br />
avoids that the current on Vbus can flow in reverse direction<br />
(example from the Colibri board to the Gecko)<br />
5<br />
Vbus<br />
A2<br />
D15<br />
PD7/FD15<br />
Q1_USB<br />
B8<br />
C3<br />
D14<br />
RESET<br />
PD6/FD14<br />
B7<br />
A3<br />
D13<br />
Wakeup<br />
PD5/FD13<br />
B3<br />
D12<br />
PD4/FD12<br />
24MHz<br />
GND<br />
C1<br />
A6<br />
D11<br />
B XtalIn<br />
PD3/FD11<br />
B<br />
C2<br />
B6<br />
D10<br />
XtalOut<br />
PD2/FD10<br />
A7<br />
D9<br />
PD1/FD9<br />
USB-MINIB<br />
C2_USB<br />
C3_USB<br />
G2<br />
A8<br />
D8<br />
IFCLK<br />
PD0/FD8<br />
JP1_USB<br />
22pF<br />
22pF<br />
B2<br />
CLKOUT<br />
H6<br />
D7<br />
Vbus<br />
PB7/FD7<br />
GND GND<br />
U1_USB<br />
F5<br />
D6<br />
ID<br />
PB6/FD6<br />
E2<br />
G5<br />
D5<br />
D+<br />
D+<br />
PB5/FD5<br />
E1<br />
EZ-USB FX2LP<br />
H5<br />
D4<br />
D-<br />
D-<br />
PB4/FD4<br />
CY7C68013A-56BAXC<br />
G4<br />
D3<br />
GND<br />
PB3/FD3<br />
SCL F3<br />
H4<br />
D2<br />
SCL<br />
PB2/FD2<br />
SDA G3<br />
F4<br />
D1<br />
SDA<br />
PB1/FD1<br />
H3<br />
D0<br />
PB0/FD0<br />
C1_USB<br />
4.7nF_250V<br />
IN IT_B/WRX A1<br />
C6<br />
DON E DONE<br />
SLRD/RDY0<br />
FlagD/SLCS/PA7<br />
DONE<br />
BUSY/RDYX B1<br />
C7<br />
RESET<br />
RESET<br />
SLWR/RDY1<br />
PKTEND/PA6<br />
RESET<br />
C8<br />
PROG_B<br />
PROG_B<br />
FIFOADR1/PA5<br />
PROG_B<br />
CCLK H7<br />
F6<br />
FlagA/CTL0<br />
FIFOADR0/PA4<br />
RDWR_B/WRU G7<br />
F7<br />
SPI_CS_F<br />
R1_USB<br />
FlagB/CTL1<br />
WU2/PA3<br />
SPI_CS_F<br />
CS_B/RDYU H8<br />
F8<br />
MISO<br />
C 1M_250V<br />
FlagC/CTL2<br />
SLOE/PA2<br />
MISO<br />
C<br />
G6<br />
MO SI<br />
INT1/PA1<br />
MOSI<br />
GND<br />
G8<br />
SCLK<br />
INT0/PA0<br />
SCLK<br />
D[0..15]<br />
F1<br />
F2<br />
B4<br />
H1<br />
D7<br />
D8<br />
C4<br />
A4<br />
H2<br />
AGND<br />
AGND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
GND<br />
Reserved<br />
shield<br />
shield<br />
AVcc<br />
AVcc<br />
Vcc<br />
Vcc<br />
Vcc<br />
Vcc<br />
Vcc<br />
Vcc<br />
D1<br />
D2<br />
A5<br />
G1<br />
E7<br />
E8<br />
C5<br />
B5<br />
100nF<br />
R2_USB<br />
300k<br />
GND<br />
2.2uF<br />
10nF<br />
Vbus<br />
Reprogramm Button<br />
S1_USB<br />
100nF<br />
C4_USB<br />
D[0..15]<br />
MLB-160808-S600Q<br />
FB1_USB<br />
3.3V<br />
GND<br />
CS_B/RDYU<br />
RDWR_B/WRU<br />
CCLK<br />
BUSY/RDYX<br />
IN IT_B/WRX<br />
CS_B/RDYU<br />
RDWR_B/WRU<br />
CCLK<br />
BUSY/RDYX<br />
INIT_B/WRX<br />
2.2K<br />
2.2K<br />
R3_USB<br />
R4_USB<br />
SCL<br />
SDA<br />
D D<br />
Titel<br />
<strong>Gecko3</strong>: USB and FPGA Boot System<br />
Blattgrösse: A4 Nummer:<br />
Revision: 0.8<br />
Datum: 08.12.2006 Zeit: 15:14:23 Blatt 8 von<br />
Datei: C:\Documents and Settings\zimmc5\svn\usb.SCHDOC<br />
18<br />
Berne School of Applied Science<br />
School of Engineering and<br />
Information Technology<br />
Quellgasse 21<br />
CH-2501 Biel<br />
1<br />
2<br />
3<br />
4<br />
Abbildung F.8.: USB 2.0 und FPGA Boot System<br />
130 Christoph Zimmermann
F.1. Gecko 3, Stand 9. Dezember 2006<br />
1<br />
2<br />
3<br />
4<br />
A A<br />
3.3V<br />
3.3V<br />
8<br />
IO0<br />
IO1<br />
IO2<br />
IO3<br />
Vcc<br />
SDA<br />
SCL<br />
GND<br />
SDA<br />
SCL<br />
SDA<br />
SCL<br />
R3_I2C<br />
4.7K<br />
7<br />
6<br />
Vbus_sw<br />
1<br />
2<br />
3<br />
5<br />
R2_I2C<br />
330<br />
R1_I2C<br />
220<br />
4<br />
U1_I2C<br />
PCA9536DP<br />
B B<br />
Switch to select desired<br />
configuration to load at start up<br />
ON = Config1, OFF = Config0<br />
1<br />
S1_I2CA<br />
SMD-DIP2<br />
ROT<br />
D1_I2CB<br />
D1_I2CA<br />
4<br />
GRUEN<br />
GND<br />
GND<br />
GND<br />
GND<br />
Switch to disable<br />
boot from EEPROM<br />
3.3V<br />
S1_I2CB<br />
2 3<br />
8<br />
WP<br />
5<br />
C SDA<br />
C<br />
7<br />
Vcc<br />
A2<br />
A1<br />
A0<br />
SCL<br />
6<br />
GND<br />
3<br />
2<br />
1<br />
GND<br />
4<br />
U2_I2C<br />
24LC128-I/SN<br />
GND<br />
D D<br />
Berne School of Applied Science<br />
School of Engineering and<br />
Information Technology<br />
Quellgasse 21<br />
CH-2501 Biel<br />
<strong>Gecko3</strong>: I2C Devices<br />
Titel<br />
18<br />
Blattgrösse: A4 Nummer:<br />
Revision: 0.5<br />
Datum: 08.12.2006 Zeit: 15:46:25 Blatt 9 von<br />
Datei: C:\Documents and Settings\zimmc5\svn\i2c.SchDoc<br />
1<br />
2<br />
3<br />
4<br />
Abbildung F.9.: I 2 C Bus mit EEPROM und I/O Baustein<br />
Project Report 131
F. Schemas<br />
1<br />
2<br />
3<br />
4<br />
R2_ETH<br />
A 4.87K<br />
A<br />
C13_ETH<br />
10uF<br />
C7_ETH<br />
3.3V<br />
100nF<br />
C6_ETH<br />
place LED near the connector 3.3V<br />
100nF<br />
D1_ETHA<br />
LINK<br />
R10_ETH 330<br />
2.2K R8_ETH<br />
2.2K R7_ETH<br />
2.2K R6_ETH<br />
100nF<br />
C8_ETH<br />
GRUEN<br />
ACTIVITY<br />
R11_ETH 220<br />
L1_ETH<br />
22nH<br />
3.3V<br />
3.3V<br />
2.2K R5_ETH<br />
2.2K R4_ETH<br />
GND<br />
D1_ETHB<br />
3.3V<br />
ROT<br />
U1_ETH<br />
DP83848I<br />
24<br />
37<br />
18<br />
23<br />
22<br />
48<br />
32<br />
100nF<br />
C5_ETH<br />
C4_ETH<br />
100nF<br />
C3_ETH<br />
100nF<br />
B B<br />
49.9<br />
49.9<br />
49.9<br />
49.9<br />
100nF<br />
C2_ETH<br />
100nF<br />
C1_ETH<br />
RD-<br />
GND GND GND<br />
GND GND<br />
TX _CLK<br />
1<br />
TX_CLK<br />
TX_CLK<br />
TX _EN<br />
2<br />
TX_EN<br />
TX_EN<br />
TX D_0<br />
3<br />
16<br />
TXD_0<br />
TD-<br />
TX D_1<br />
4<br />
17<br />
JP1_ETH<br />
TXD_1<br />
TD+<br />
TX D_2<br />
5<br />
TXD_2<br />
TX D_3<br />
6<br />
13<br />
TXD_3/(SNI_MODE)<br />
RD-<br />
TX D_[0..3]<br />
14<br />
TXD_[0..3]<br />
RD+<br />
RX_CLK<br />
38<br />
RX_CLK<br />
RX_CLK<br />
RX_DV<br />
39<br />
28<br />
RX_DV<br />
RX_DV/(MII_MODE) LED_LINK/(AN_0)<br />
RX_ER<br />
41<br />
27<br />
C11_ETH C12_ETH<br />
RX_ER<br />
RX_ER/(MDIX_EN) LED_SPEED/(AN_1)<br />
RXD_0<br />
43<br />
26<br />
100nF<br />
100nF<br />
RXD_0/(PHYAD1) LED_ACT/COL/(AN_EN)<br />
RXD_1<br />
44<br />
Route the RD/TD Signals GND<br />
RXD_1/(PHYAD2)<br />
RXD_2<br />
45<br />
as differential Pairs<br />
RXD_2/(PHYAD3)<br />
RXD_3<br />
46<br />
GND<br />
GND<br />
RXD_3/(PHYAD4)<br />
RXD_[0..3]<br />
34<br />
RXD_[0..3]<br />
X1<br />
COL<br />
42<br />
33<br />
COL<br />
COL/(PHYAD0)<br />
X2<br />
CRS<br />
40<br />
25<br />
C CRS<br />
CRS/CRS_DV/(LED_CFG) 25MHz_OUT<br />
C<br />
3.3V<br />
1.5K<br />
Place this components near the chip<br />
R1_ETH<br />
Q1_ETH<br />
MD C<br />
31<br />
21<br />
MDC<br />
MDC<br />
RESERVED<br />
MD IO<br />
30<br />
20<br />
MDIO<br />
MDIO<br />
RESERVED<br />
25MHz<br />
TD -<br />
R14_ETH<br />
R13_ETH<br />
R12_ETH<br />
R_BIAS<br />
R9_ETH<br />
PFB_IN2<br />
PFB_IN1<br />
PFB_OUT<br />
AVDD33<br />
IOVDD33<br />
IOVDD33<br />
1<br />
3<br />
5<br />
2<br />
4<br />
6<br />
RD+<br />
TD +<br />
MII Interface<br />
C10_ETH<br />
33pF<br />
C9_ETH<br />
33pF<br />
PWR_DOWN/INT<br />
RESET<br />
GND GND<br />
TCK<br />
TDI<br />
TDO<br />
TMS<br />
TRST<br />
8<br />
12<br />
9<br />
AGND<br />
AGND<br />
IOGND<br />
IOGND<br />
DGND<br />
10<br />
11<br />
PWR_DOWN/INT<br />
7<br />
29<br />
15<br />
19<br />
35<br />
47<br />
36<br />
PWR_DOWN/INT<br />
ETH_RESET<br />
ETH_RESET<br />
R3_ETH<br />
D D<br />
GND<br />
4.7K<br />
Berne School of Applied Science<br />
Titel <strong>Gecko3</strong>: Ethernet PHY<br />
School of Engineering and<br />
Blattgrösse: A4 Nummer:<br />
Revision: 0.7<br />
Information Technology<br />
GND<br />
Quellgasse 21<br />
CH-2501 Biel<br />
Datum: 08.12.2006 Zeit: 15:20:42 Blatt 10 von 18<br />
Datei: C:\Documents and Settings\zimmc5\svn\ethernet.SCHDOC<br />
1<br />
2<br />
3<br />
4<br />
Abbildung F.10.: Ethernet PHY<br />
132 Christoph Zimmermann
F.1. Gecko 3, Stand 9. Dezember 2006<br />
1<br />
2<br />
3<br />
4<br />
A A<br />
3.3V<br />
B B<br />
U1_SPI<br />
Vcc<br />
2<br />
MO SI 15<br />
MOSI<br />
SPI_CS_F<br />
SPI_CS_F 7<br />
S<br />
M25P16<br />
D<br />
C<br />
SCLK 16<br />
Q<br />
8<br />
MISO<br />
SCLK MISO<br />
1<br />
9<br />
W<br />
HOLD<br />
10<br />
Vss<br />
C C<br />
GND<br />
D D<br />
Titel<br />
<strong>Gecko3</strong>: SPI Serial Flash<br />
Blattgrösse: A4 Nummer:<br />
Revision: 0.7<br />
Datum: 08.12.2006 Zeit: 15:16:16 Blatt 11 von 18<br />
Datei: C:\Documents and Settings\zimmc5\svn\spi-flash.SchDoc<br />
Berne School of Applied Science<br />
School of Engineering and<br />
Information Technology<br />
Quellgasse 21<br />
CH-2501 Biel<br />
1<br />
2<br />
3<br />
4<br />
Abbildung F.11.: SPI Flash, Speicher für FPGA Konfigurationen<br />
Project Report 133
F. Schemas<br />
1<br />
2<br />
3<br />
4<br />
A A<br />
Switch[0..3]<br />
Switch[0..3]<br />
Button[0..2]<br />
Reset<br />
Button[0..2]<br />
Reset<br />
LED[0..7]<br />
LED[0..7]<br />
3.3V<br />
220 R1_SW<br />
D1_SWA<br />
LED0 B 330 R2_SW<br />
D1_SWB<br />
3.3V<br />
B<br />
GRUEN<br />
LED1 1<br />
2<br />
3<br />
4<br />
LED2<br />
220 R3_SW<br />
D2_SWA<br />
ROT<br />
330 D2_SWB<br />
LED3 R4_SW<br />
GRUEN<br />
Button0<br />
Switch0<br />
ROT<br />
Button1<br />
Switch1<br />
220 R5_SW D3_SWA<br />
Button2<br />
Switch2<br />
LED4<br />
Reset<br />
Switch3<br />
330 D3_SWB<br />
LED5 R6_SW<br />
GRUEN<br />
S1_SW S2_SW S3_SW S4_SW<br />
ROT<br />
220 D4_SWA<br />
Button0 Button1 Button2 Reset Button<br />
LED6 R7_SW<br />
C 330 R8_SW D4_SWB<br />
4.7K<br />
C<br />
LED7<br />
GRUEN<br />
R9_SW<br />
4.7K<br />
R10_SW<br />
4.7K<br />
R11_SW<br />
4.7K<br />
R12_SW<br />
4.7K<br />
S5_SW<br />
R13_SW<br />
R14_SW<br />
R15_SW<br />
R16_SW<br />
8<br />
7<br />
6<br />
5<br />
ROT<br />
GND<br />
GND<br />
GND<br />
D D<br />
Titel<br />
<strong>Gecko3</strong>: Switches and LEDs<br />
Blattgrösse: A4 Nummer:<br />
Revision: 0.8<br />
Datum: 08.12.2006 Zeit: 14:56:55 Blatt 12 von 18<br />
Datei: C:\Documents and Settings\zimmc5\svn\switches.SchDoc<br />
Berne School of Applied Science<br />
School of Engineering and<br />
Information Technology<br />
Quellgasse 21<br />
CH-2501 Biel<br />
1<br />
2<br />
3<br />
4<br />
Abbildung F.12.: Schalter, Taster und LEDs<br />
134 Christoph Zimmermann
1<br />
1<br />
2<br />
2<br />
3<br />
3<br />
4<br />
4<br />
5<br />
5<br />
6<br />
6<br />
7<br />
7<br />
8<br />
8<br />
F.1. Gecko 3, Stand 9. Dezember 2006<br />
Vbus<br />
Vbus<br />
PWM[0..7]<br />
A A<br />
Ubatt<br />
FB1_IO<br />
GPIO1_[0..59]<br />
eBot Chassis<br />
Sensors[0..5]<br />
Encoder[0..7]<br />
Low Battery<br />
Power Good<br />
PWM[0..7]<br />
Encode r[0..7]<br />
Sensors[0..5]<br />
GPIO1_[0..59]<br />
Power Good<br />
Low Battery<br />
MLB-160808-S600Q<br />
C1_IO<br />
220uF<br />
GND<br />
3.3V<br />
FB2_IO<br />
MLB-160808-S600Q<br />
C2_IO<br />
220uF<br />
GND<br />
B B<br />
JP2_IO<br />
AMP-FH-120-RECEPTABLE-H9-H13<br />
fh-120r<br />
top<br />
1 2<br />
GPIO1_0<br />
GPIO1_1<br />
3 4<br />
GPIO1_2 GPIO1_3<br />
5 6<br />
GPIO1_4 GPIO1_5<br />
7 8<br />
GPIO1_6 GPIO1_7<br />
9 10<br />
GPIO1_8 GPIO1_9<br />
11 12<br />
GPIO1_10 GPIO1_11<br />
13 14<br />
GPIO1_12 GPIO1_13<br />
15 16<br />
GPIO1_14 GPIO1_15<br />
17 18<br />
GPIO1_16 GPIO1_17<br />
19 20<br />
GPIO1_18 GPIO1_19<br />
21 22<br />
GPIO1_20 GPIO1_21<br />
23 24<br />
GPIO1_22 GPIO1_23<br />
25 26<br />
GPIO1_24 GPIO1_25<br />
27 28<br />
29 30<br />
Vbus Vbus<br />
31 32<br />
33 34<br />
Ubatt<br />
Ubatt<br />
35 36<br />
37 38<br />
39 40<br />
41 42<br />
43 44<br />
45 46<br />
3.3V<br />
3.3V<br />
47 48<br />
49 50<br />
51 52<br />
53 54<br />
55 56<br />
Low Battery<br />
Power Good<br />
57 58<br />
59 60<br />
PWM0<br />
Encode r0<br />
61 62<br />
PWM1<br />
Encode r1<br />
63 64<br />
PWM2<br />
Encode r2<br />
65 66<br />
PWM3<br />
Encode r3<br />
67 68<br />
PWM4<br />
Encode r4<br />
69 70<br />
PWM5<br />
Encode r5<br />
71 72<br />
PWM6<br />
Encode r6<br />
73 74<br />
PWM7<br />
Encode r7<br />
75 76<br />
Sensors0<br />
Sensors5<br />
77 78<br />
Sensors1<br />
Sensors4<br />
79 80<br />
Sensors2 Sensors3<br />
81 82<br />
GPIO1_26 GPIO1_27<br />
83 84<br />
GPIO1_28 GPIO1_29<br />
85 86<br />
GPIO1_30 GPIO1_31<br />
87 88<br />
89 90<br />
GPIO1_32 GPIO1_33<br />
91 92<br />
GPIO1_34 GPIO1_35<br />
93 94<br />
GPIO1_36 GPIO1_37<br />
95 96<br />
GPIO1_38 GPIO1_39<br />
97 98<br />
GPIO1_40 GPIO1_41<br />
99 100<br />
GPIO1_42 GPIO1_43<br />
101102<br />
GPIO1_44 GPIO1_45<br />
103104<br />
GPIO1_46 GPIO1_47<br />
105106<br />
GPIO1_48 GPIO1_49<br />
107108<br />
GPIO1_50 GPIO1_51<br />
109110<br />
GPIO1_52 GPIO1_53<br />
111112<br />
GPIO1_54 GPIO1_55<br />
113114<br />
GPIO1_56 GPIO1_57<br />
115116<br />
GPIO1_58 GPIO1_59<br />
117118<br />
119120<br />
GND<br />
C C<br />
bottom<br />
JP1_IO<br />
AMP-FH-120-Plug<br />
fh-120p<br />
1 2<br />
GPIO1_0<br />
GPIO1_1<br />
3 4<br />
GPIO1_2 GPIO1_3<br />
5 6<br />
GPIO1_4 GPIO1_5<br />
7 8<br />
GPIO1_6 GPIO1_7<br />
9 10<br />
GPIO1_8 GPIO1_9<br />
11 12<br />
GPIO1_10 GPIO1_11<br />
13 14<br />
GPIO1_12 GPIO1_13<br />
15 16<br />
GPIO1_14 GPIO1_15<br />
17 18<br />
GPIO1_16 GPIO1_17<br />
19 20<br />
GPIO1_18 GPIO1_19<br />
21 22<br />
GPIO1_20 GPIO1_21<br />
23 24<br />
GPIO1_22 GPIO1_23<br />
25 26<br />
GPIO1_24 GPIO1_25<br />
27 28<br />
29 30<br />
Vbus Vbus<br />
31 32<br />
33 34<br />
Ubatt<br />
Ubatt<br />
35 36<br />
37 38<br />
39 40<br />
41 42<br />
43 44<br />
45 46<br />
3.3V<br />
3.3V<br />
47 48<br />
49 50<br />
51 52<br />
53 54<br />
55 56<br />
Low Battery Power Good<br />
57 58<br />
59 60<br />
PWM0<br />
Encode r0<br />
61 62<br />
PWM1<br />
Encode r1<br />
63 64<br />
PWM2<br />
Encode r2<br />
65 66<br />
PWM3<br />
Encode r3<br />
67 68<br />
PWM4<br />
Encode r4<br />
69 70<br />
PWM5<br />
Encode r5<br />
71 72<br />
PWM6<br />
Encode r6<br />
73 74<br />
PWM7<br />
Encode r7<br />
75 76<br />
Sensors0<br />
Sensors5<br />
77 78<br />
Sensors1<br />
Sensors4<br />
79 80<br />
Sensors2 Sensors3<br />
81 82<br />
GPIO1_26 GPIO1_27<br />
83 84<br />
GPIO1_28 GPIO1_29<br />
85 86<br />
GPIO1_30 GPIO1_31<br />
87 88<br />
89 90<br />
GPIO1_32 GPIO1_33<br />
91 92<br />
GPIO1_34 GPIO1_35<br />
93 94<br />
GPIO1_36 GPIO1_37<br />
95 96<br />
GPIO1_38 GPIO1_39<br />
97 98<br />
GPIO1_40 GPIO1_41<br />
99 100<br />
GPIO1_42 GPIO1_43<br />
101102<br />
GPIO1_44 GPIO1_45<br />
103104<br />
GPIO1_46 GPIO1_47<br />
105106<br />
GPIO1_48 GPIO1_49<br />
107108<br />
GPIO1_50 GPIO1_51<br />
109110<br />
GPIO1_52 GPIO1_53<br />
111112<br />
GPIO1_54 GPIO1_55<br />
113114<br />
GPIO1_56 GPIO1_57<br />
115116<br />
GPIO1_58 GPIO1_59<br />
117118<br />
119120<br />
GND<br />
D D<br />
Berne School of Applied Science<br />
School of Engineering and<br />
Information Technology<br />
Quellgasse 21<br />
CH-2501 Biel<br />
Titel <strong>Gecko3</strong>: Po wer and I/O Bus<br />
Blattgrösse: A3 Nummer:<br />
Revision: 0.8<br />
Datum: 08.12.2006 Zeit: 14:56:04 Blatt 13 von 18<br />
Datei: C:\Documents and Settings\ zimmc5\svn\io-bus.SchDoc<br />
Abbildung F.13.: Erweiterungsbus, 1. Teil<br />
Project Report 135
1<br />
1<br />
2<br />
2<br />
3<br />
3<br />
4<br />
4<br />
5<br />
5<br />
6<br />
6<br />
7<br />
7<br />
8<br />
8<br />
F. Schemas<br />
I2C<br />
Colibri bus or used as GPIO<br />
A A<br />
GPIO2[0..34]<br />
Reset<br />
SCL_ext<br />
SDA_ext<br />
MD[0..31]<br />
MA[0..25]<br />
DQM[0..3]<br />
DREQ[1..2]<br />
B B<br />
1 2<br />
GPIO2_0<br />
GPIO2_1<br />
3 4<br />
GPIO2_2 GPIO2_3<br />
5 6<br />
GPIO2_4 GPIO2_5<br />
7 8<br />
GPIO2_6 GPIO2_7<br />
9 10<br />
GPIO2_8 GPIO2_9<br />
11 12<br />
GPIO2_10 GPIO2_11<br />
13 14<br />
GPIO2_12 GPIO2_13<br />
15 16<br />
GPIO2_14 GPIO2_15<br />
17 18<br />
GPIO2_16 GPIO2_17<br />
19 20<br />
GPIO2_18 GPIO2_19<br />
21 22<br />
GPIO2_20 GPIO2_21<br />
23 24<br />
GPIO2_22 GPIO2_23<br />
25 26<br />
GPIO2_24 GPIO2_25<br />
27 28<br />
GPIO2_26 GPIO2_27<br />
29 30<br />
GPIO2_28 GPIO2_29<br />
31 32<br />
GPIO2_30 GPIO2_31<br />
33 34<br />
GPIO2_32 GPIO2_33<br />
35 36<br />
Reset<br />
37 38<br />
EX TCLK 1<br />
39 40<br />
EX TCLK 0<br />
41 42<br />
SCL_ext<br />
43 44<br />
RDY<br />
SDA_ext<br />
45 46<br />
nCS1<br />
47 48<br />
nCS3<br />
DREQ 1<br />
49 50<br />
nCS4<br />
DREQ 2<br />
51 52<br />
RDnWR<br />
53 54<br />
nWE<br />
55 56<br />
nOE<br />
57 58<br />
DQM0<br />
59 60<br />
DQM1<br />
61 62<br />
DQM2<br />
63 64<br />
DQM3<br />
65 66<br />
67 68<br />
69 70<br />
71 72<br />
73 74<br />
75 76<br />
77 78<br />
79 80<br />
81 82<br />
83 84<br />
85 86<br />
87 88<br />
89 90<br />
91 92<br />
93 94<br />
95 96<br />
97 98<br />
99 100<br />
101102<br />
103104<br />
105106<br />
107108<br />
109110<br />
111112<br />
113114<br />
115116<br />
117118<br />
119120<br />
JP1_IO2<br />
AMP-FH-120-RECEPTABLE-H9-H13<br />
fh-120r<br />
top<br />
GND<br />
C C<br />
1 2<br />
GPIO2_0<br />
GPIO2_1<br />
3 4<br />
GPIO2_2 GPIO2_3<br />
5 6<br />
GPIO2_4 GPIO2_5<br />
7 8<br />
GPIO2_6 GPIO2_7<br />
9 10<br />
GPIO2_8 GPIO2_9<br />
11 12<br />
GPIO2_10 GPIO2_11<br />
13 14<br />
GPIO2_12 GPIO2_13<br />
15 16<br />
GPIO2_14 GPIO2_15<br />
17 18<br />
GPIO2_16 GPIO2_17<br />
19 20<br />
GPIO2_18 GPIO2_19<br />
21 22<br />
GPIO2_20 GPIO2_21<br />
23 24<br />
GPIO2_22 GPIO2_23<br />
25 26<br />
GPIO2_24 GPIO2_25<br />
27 28<br />
GPIO2_26 GPIO2_27<br />
29 30<br />
GPIO2_28 GPIO2_29<br />
31 32<br />
GPIO2_30 GPIO2_31<br />
33 34<br />
GPIO2_32 GPIO2_33<br />
35 36<br />
Reset<br />
37 38<br />
EX TCLK 1<br />
39 40<br />
EX TCLK 0<br />
41 42<br />
SCL_ext<br />
43 44<br />
RDY<br />
SDA_ext<br />
45 46<br />
nCS1<br />
47 48<br />
nCS3<br />
DREQ1<br />
49 50<br />
nCS4<br />
DREQ2<br />
51 52<br />
RDnWR<br />
53 54<br />
nWE<br />
55 56<br />
nOE<br />
57 58<br />
DQM0<br />
59 60<br />
DQM1<br />
61 62<br />
DQM2<br />
63 64<br />
DQM3<br />
65 66<br />
67 68<br />
69 70<br />
71 72<br />
73 74<br />
75 76<br />
77 78<br />
79 80<br />
81 82<br />
83 84<br />
85 86<br />
87 88<br />
89 90<br />
91 92<br />
93 94<br />
95 96<br />
97 98<br />
99 100<br />
101102<br />
103104<br />
105106<br />
107108<br />
109110<br />
111112<br />
113114<br />
115116<br />
117118<br />
119120<br />
JP2_IO2<br />
AMP-FH-120-Plug<br />
fh-120p<br />
MA 0<br />
MA 1<br />
MA 2<br />
MA 3<br />
MA 4<br />
MA 5<br />
MA 6<br />
MA 7<br />
MA 8<br />
MA 9<br />
MA 10<br />
MA 11<br />
MA 12<br />
MA 13<br />
MA 14<br />
MA 15<br />
MA 16<br />
MA 17<br />
MA 18<br />
MA 19<br />
MA 20<br />
MA 21<br />
MA 22<br />
MA 23<br />
MA 24<br />
MA 25<br />
bottom<br />
MD 0<br />
MD 1<br />
MD 2<br />
MD 3<br />
MD 4<br />
MD 5<br />
MD 6<br />
MD 7<br />
MD 8<br />
MD 9<br />
MD 10<br />
MD 11<br />
MD 12<br />
MD 13<br />
MD 14<br />
MD 15<br />
MD 16<br />
MD 17<br />
MD 18<br />
MD 19<br />
MD 20<br />
MD 21<br />
MD 22<br />
MD 23<br />
MD 24<br />
MD 25<br />
MD 26<br />
MD 27<br />
MD 28<br />
MD 29<br />
MD 30<br />
MD 31<br />
MA 0<br />
MA 1<br />
MA 2<br />
MA 3<br />
MA 4<br />
MA 5<br />
MA 6<br />
MA 7<br />
MA 8<br />
MA 9<br />
MA 10<br />
MA 11<br />
MA 12<br />
MA 13<br />
MA 14<br />
MA 15<br />
MA 16<br />
MA 17<br />
MA 18<br />
MA 19<br />
MA 20<br />
MA 21<br />
MA 22<br />
MA 23<br />
MA 24<br />
MA 25<br />
MD 0<br />
MD 1<br />
MD 2<br />
MD 3<br />
MD 4<br />
MD 5<br />
MD 6<br />
MD 7<br />
MD 8<br />
MD 9<br />
MD 10<br />
MD 11<br />
MD 12<br />
MD 13<br />
MD 14<br />
MD 15<br />
MD 16<br />
MD 17<br />
MD 18<br />
MD 19<br />
MD 20<br />
MD 21<br />
MD 22<br />
MD 23<br />
MD 24<br />
MD 25<br />
MD 26<br />
MD 27<br />
MD 28<br />
MD 29<br />
MD 30<br />
MD 31<br />
GPIO2[0..34]<br />
EX TCLK 0<br />
EX TCLK 1<br />
Reset<br />
SCL_ext<br />
SDA_ext<br />
MD [0 .31]<br />
MA [0..25]<br />
DQM[0..3]<br />
nOE<br />
nWE<br />
RDnWR<br />
nCS4<br />
nCS3<br />
nCS1<br />
RDY<br />
DREQ[1..2]<br />
EXTCLK0<br />
EXTCLK1<br />
nOE<br />
nWE<br />
RDnWR<br />
nCS4<br />
nCS3<br />
nCS1<br />
RDY<br />
GND<br />
D D<br />
Titel <strong>Gecko3</strong>: System and I/O Bus<br />
Blattgrösse: A3 Nummer:<br />
Revision: 0.7<br />
Datum: 08.12.2006 Zeit: 15:15:51 Blatt 14 von 18<br />
Datei: C:\Documents and Settings\ zimmc5\svn\io-bus2.SchDoc<br />
Berne School of Applied Science<br />
School of Engineering and<br />
Information Technology<br />
Quellgasse 21<br />
CH-2501 Biel<br />
Abbildung F.14.: Erweiterungsbus, 2. Teil<br />
136 Christoph Zimmermann
F.1. Gecko 3, Stand 9. Dezember 2006<br />
1<br />
2<br />
3<br />
4<br />
A A<br />
DC/DC Converter for the FPGA Core Supply, 1.2 V, 2.5 A<br />
2.5 V, 0.5 A and 1.25 V Refernce Supply GND Testpad for Probes<br />
C4_PWR<br />
C5_PWR<br />
Ubatt<br />
3.3V<br />
3<br />
U2_PWR<br />
LP8340CDT-2.5<br />
IN<br />
OUT<br />
1<br />
2.5V<br />
TP1_PWR<br />
GND<br />
B B<br />
GND GND<br />
GND<br />
GND<br />
C1_PWR<br />
1nF<br />
X7R<br />
GND<br />
R1_PWR<br />
2.2M<br />
C2_PWR<br />
R2_PWR<br />
180K<br />
R3_PWR<br />
6.2K<br />
22pF C3_PWR<br />
GND<br />
C C<br />
1nF<br />
X7R<br />
1<br />
15<br />
13<br />
16<br />
Run/SS<br />
RT<br />
Ith<br />
Sync/Mode<br />
GND<br />
Pgood<br />
Vfb<br />
1nF<br />
12<br />
14<br />
GND<br />
22uF<br />
R4_PWR<br />
160K<br />
C6_PWR<br />
R5_PWR<br />
22pF<br />
X5R<br />
82K<br />
GND<br />
1.2V<br />
C7_PWR<br />
22uF<br />
2.5V<br />
GND<br />
R6_PWR<br />
100<br />
C8_PWR<br />
100nF<br />
GND<br />
GND<br />
R7_PWR<br />
100<br />
GND<br />
Vref<br />
C9_PWR<br />
100nF<br />
Bulk Capacitor for both Flash Chips<br />
3.3V<br />
2<br />
17<br />
7<br />
6<br />
SGND<br />
SGND<br />
PGND<br />
PGND<br />
SVin<br />
PVin<br />
PVin<br />
11<br />
3<br />
10<br />
4<br />
GND<br />
SW 4<br />
SW 5<br />
SW 8<br />
SW 9<br />
U1_PWR<br />
LTC3412A<br />
L1_PWR<br />
2uH SD14-2R0-R<br />
C11_PWR<br />
2.2uF<br />
C12_PWR<br />
10uF<br />
C10_PWR<br />
10uF<br />
GND<br />
D D<br />
Titel<br />
<strong>Gecko3</strong>: Power Suplies<br />
Blattgrösse: A4 Nummer:<br />
Revision: 0.7<br />
Datum: 08.12.2006 Zeit: 14:56:39 Blatt 15 von 18<br />
Datei: C:\Documents and Settings\zimmc5\svn\power.SCHDOC<br />
Berne School of Applied Science<br />
School of Engineering and<br />
Information Technology<br />
Quellgasse 21<br />
CH-2501 Biel<br />
1<br />
2<br />
3<br />
4<br />
Abbildung F.15.: Spannungsversorgung<br />
Project Report 137
F. Schemas<br />
1<br />
2<br />
3<br />
4<br />
A A<br />
3.3V<br />
B B<br />
TMS<br />
TDI<br />
TDO<br />
TCK<br />
TMS<br />
TD I<br />
TD O<br />
TCK<br />
R2_JTAG<br />
100<br />
R1_JTAG<br />
100<br />
R3_JTAG<br />
100<br />
3.3V<br />
JP1_JTAG<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
JTAG Connector<br />
for the Digilent Programming Cable<br />
Serial out<br />
JP2_JTAG<br />
Connector for serial communication<br />
1 2<br />
3 4<br />
GND<br />
Header 1x6, right angle<br />
Serial in<br />
GND<br />
C C<br />
D D<br />
Titel<br />
<strong>Gecko3</strong>: Jtag and RS232 Connector<br />
Blattgrösse: A4 Nummer:<br />
Revision: 0.7<br />
Datum: 08.12.2006 Zeit: 15:45:01 Blatt 16 von<br />
Datei: C:\Documents and Settings\zimmc5\svn\jtag.SchDoc<br />
18<br />
Berne School of Applied Science<br />
School of Engineering and<br />
Information Technology<br />
Quellgasse 21<br />
CH-2501 Biel<br />
1<br />
2<br />
3<br />
4<br />
Abbildung F.16.: JTAG Anschluss<br />
138 Christoph Zimmermann
F.1. Gecko 3, Stand 9. Dezember 2006<br />
1<br />
2<br />
3<br />
4<br />
A A<br />
3.3V<br />
B B<br />
Schematic of the Magjack SI-10021<br />
RD-<br />
6 5<br />
RD+<br />
TD -<br />
4 3<br />
TD +<br />
2 1<br />
8<br />
7<br />
TD+ 6<br />
5<br />
JP2<br />
TD- 4<br />
RD+ 3<br />
2<br />
RD- 1<br />
JP1<br />
8<br />
7<br />
6<br />
5<br />
4<br />
3<br />
2<br />
1<br />
s<br />
Ma gjac k<br />
Shield<br />
s SI-10021<br />
Shield<br />
C1<br />
100nF<br />
C2<br />
100nF<br />
C C<br />
MLB-160808-0300A-N2<br />
GND<br />
FB1<br />
D D<br />
Titel<br />
Ethernet Connector PCB<br />
Blattgrösse: A4 Nummer:<br />
Revision: 0.7<br />
Datum: 13.12.2006 Zeit: 08:35:04 Blatt 17 von 18<br />
Datei: \\Blender.bfh.ch\data\fbe\microlab\GECKO3\FPGA_board\protel\ethernet-connector.SchDoc<br />
Berne School of Applied Science<br />
School of Engineering and<br />
Information Technology<br />
Quellgasse 21<br />
CH-2501 Biel<br />
1<br />
2<br />
3<br />
4<br />
Abbildung F.17.: Ethernet Anschluss Print<br />
Project Report 139
F. Schemas<br />
1<br />
2<br />
3<br />
4<br />
A A<br />
C1<br />
100nF<br />
3.3V<br />
U1<br />
B B<br />
3.3V<br />
1<br />
16<br />
C1+ VCC<br />
3<br />
2<br />
C1- V+<br />
3.3V<br />
4<br />
C2+<br />
C2<br />
5<br />
C2-<br />
Serial out<br />
R1<br />
100nF<br />
C3<br />
X1<br />
4.7K<br />
11<br />
14 100nF<br />
1<br />
10<br />
12<br />
9<br />
15<br />
GND<br />
MAX3232CSE<br />
C C<br />
V-<br />
7<br />
13<br />
1 2<br />
3 4<br />
GND<br />
JP1<br />
Serial in<br />
GND<br />
8<br />
6<br />
C4<br />
100nF<br />
GND<br />
DB9M<br />
6<br />
2<br />
7<br />
3<br />
8<br />
4<br />
9<br />
5<br />
GND<br />
D D<br />
Titel<br />
Serial Adapter<br />
Blattgrösse: A4 Nummer:<br />
Revision: 1<br />
Datum: 13.12.2006 Zeit: 08:36:01 Blatt 18 von 18<br />
Datei: \\Blender.bfh.ch\data\fbe\microlab\GECKO3\FPGA_board\protel\serial-con.SchDoc<br />
Berne School of Applied Science<br />
School of Engineering and<br />
Information Technology<br />
Quellgasse 21<br />
CH-2501 Biel<br />
1<br />
2<br />
3<br />
4<br />
Abbildung F.18.: RS232 Anschluss Print<br />
140 Christoph Zimmermann
F.2. Flashboard<br />
F.2. Flashboard<br />
1<br />
2<br />
3<br />
4<br />
X1<br />
3.3V<br />
3.3V Connector: A1<br />
Busy<br />
JP1<br />
A A<br />
GND<br />
C4<br />
10uF<br />
Flash_Addr18<br />
Flash_Addr19<br />
Flash_Addr20<br />
Flash_Addr21<br />
Flash_Addr22<br />
Flash_Addr23<br />
Flash_RP<br />
Flash_CE0<br />
Flash_Addr6<br />
Flash_Addr8<br />
Flash_Addr10<br />
Flash_Addr12<br />
Flash_Addr14<br />
Flash_Addr16<br />
Flash_Addr17<br />
1 2<br />
3 4<br />
5 6<br />
7 8<br />
9 10<br />
11 12<br />
13 14<br />
15 16<br />
17 18<br />
19 20<br />
21 22<br />
23 24<br />
25 26<br />
27 28<br />
29 30<br />
31 32<br />
33 34<br />
35 36<br />
37 38<br />
39 40<br />
B B<br />
GND<br />
Header 20X2<br />
Flash_Addr0<br />
Flash_Addr1<br />
Flash_Addr2<br />
Flash_Addr3<br />
Flash_Addr4<br />
Flash_WE<br />
Flash_OE<br />
Flash_BYTE<br />
Flash_Addr5<br />
Flash_Addr7<br />
Flash_Addr9<br />
Flash_Addr11<br />
Flash_Addr13<br />
Flash_Addr15<br />
Flash1_DQ[0..15]<br />
Flash_Addr[0..23]<br />
flash<br />
flash.SchDoc<br />
Flash_DQ[0..15]<br />
Flash_A[0..23]<br />
Flash_BYTE<br />
Flash_WE<br />
Flash_RP<br />
Flash_OE<br />
Flash_CE0<br />
Flash2_DQ[0..15]<br />
Flash_DQ[0..15]<br />
Flash_Addr[0..23]<br />
Flash_A[0..23]<br />
Flash_BYTE<br />
3.3V<br />
3.3V Connector: A2<br />
Flash_WE<br />
Flash_RP<br />
JP2<br />
Flash_OE<br />
C 1 2<br />
Flash_CE0<br />
C<br />
C5 3 4<br />
Flash1_DQ0<br />
10uF<br />
Flash1_DQ2<br />
5 6<br />
Flash1_DQ1 7 8<br />
Flash1_DQ3 Flash1_DQ4<br />
9 10<br />
Flash1_DQ5 Flash1_DQ6<br />
GND<br />
11 12<br />
Flash1_DQ7 Flash1_DQ8<br />
13 14<br />
Flash1_DQ9 Flash1_DQ10<br />
15 16<br />
Flash1_DQ11 Flash1_DQ12<br />
17 18<br />
Flash1_DQ13 Flash1_DQ14<br />
19 20<br />
Flash1_DQ15 Flash2_DQ0<br />
21 22<br />
Flash2_DQ1 Flash2_DQ2<br />
23 24<br />
Flash2_DQ3 Flash2_DQ4<br />
25 26<br />
Flash2_DQ5 Flash2_DQ6<br />
27 28<br />
Flash2_DQ7 Flash2_DQ8<br />
29 30<br />
Flash2_DQ9 Flash2_DQ10<br />
31 32<br />
Flash2_DQ11 Flash2_DQ12<br />
33 34<br />
Flash2_DQ13 Flash2_DQ14<br />
Flash2_DQ15<br />
35 36<br />
37 38<br />
with this board you can't use the second oscilator!<br />
D 39 40<br />
D<br />
Header 20X2<br />
Berne School of Applied Science<br />
Titel Flash Memory Board for the Spartan3 Developmentboard<br />
GND<br />
School of Engineering and<br />
Information Technology<br />
A4 Blattgrösse: Nummer:<br />
Revision: 0.2<br />
Quellgasse 21<br />
CH-2501 Biel<br />
Datum: Zeit: 08.12.2006 17:51:37 Blatt von<br />
Datei: C:\Documents and Settings\zimmc5\flash-board\flashboard.SchDoc<br />
flash<br />
flash.SchDoc<br />
1<br />
2<br />
3<br />
4<br />
1<br />
1<br />
Abbildung F.19.: Adapterprint Intel NOR Flash<br />
Project Report 141
G. Grössenplanung der <strong>Gecko3</strong><br />
Leiterplatte<br />
Abbildung G.1.: Zeichnung des <strong>Gecko3</strong> Board im Masssstab 1:1<br />
142 Christoph Zimmermann
Literaturverzeichnis<br />
[Bre03]<br />
Ulrich Breymann. C++ Einführung und professionelle Programmierung. Hanser,<br />
2003.<br />
[Cad00] Gerhard R. Cadek. Digital Design Guidelines for FPGA Design. Arbeitsgruppe<br />
CAD - Institut für Computertechnik - TU Wien, May 2000.<br />
[Cyp03] Cypress Semiconductor Corporation, 3901 North First Street San Jose, CA 95134.<br />
EZ-USB FX2 GPIF Primer, April 2003.<br />
[Cyp06] Cypress. EZ-USB Technical Reference Manual. Cypress, 2006.<br />
[Hyd99] John Hyde. USB Desing by Example (A practical Guide to building I/O Devices).<br />
Intel, 1999.<br />
[Jac]<br />
[Mic]<br />
[NP02]<br />
Dr. Marcel Jacomet. VLSI System Design. Berne School of Applied Sciences.<br />
Microchip. I2C CMOS Serial EEPROM.<br />
Mark Ng and Mike Peattie. Using a Microprocessor to Configure Xilinx FPGAs via<br />
Slave Serial or SelectMAP Mode. Xilinx, November 2002.<br />
[Sch03] J. Reichardt/ B. Schwarz. VHDL-Synthese. Oldenbourg, 2003.<br />
[Tse04] Chen Wei Tseng. Spartan-3 Advanced Configuration Architecture. Xilinx, Inc, 1.0<br />
edition, December 2004.<br />
Project Report 143