25.12.2013 Aufrufe

Gecko3 - CCC Event Weblog

Gecko3 - CCC Event Weblog

Gecko3 - CCC Event Weblog

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!