FPGA Soft Core
Einleitung
Ein soft core (engl. wörtlich "weicher Kern", sinngemäß "Software-Kern") ist ein Prozessor, ein Mikrocontroller oder ein digitaler Signalprozessor, welcher als virtuelle Einheit in einem FPGA oder ASIC integriert wird. Somit kann theoretisch jeder beliebige Prozessor zu einem digitalen Schaltungsdesign hinzugefügt werden, wobei er in einem ASIC de facto zu einem hard core (engl. harter Kern) wird. Im FPGA besteht dieser aus reiner Anwenderlogik, welche dazu entsprechend konfiguriert wird. Alternativ exisitieren in FPGAs auch echte hard cores, die bereits auf dem Chip platziert wurden. Einige Hersteller ermöglichen es darüber hinaus die Überführung eines vollständigen FPGA-designs in einen ASIC, womit praktisch ebenfalls ein hard core entsteht.
Im Regelfall werden soft cores in FPGAs dazu verwendet, komplizierte Aufgaben zu erledigen, die eine klassische state machine überfordern oder ineffektiv werden ließen, die aber gleichzeitig nicht zu hohe Anforderungen an die Geschwindigkeit stellen. Oft werden SCs im Nachhinein in FPGAs integriert, wenn sich im Zuge einer Erweiterung des Funktionsumfangs herausstellt, dass die Aufgaben komplexer werden und intelligente Verwaltung gefordert wird.
Vergleich von soft cores und hard cores
Vorteile:
- Flexible Anwendung, das FPGA kann bei Bedarf mit einem SoftCore versehen werden; es wird im Vorhinein jedoch keine Chipfläche für einen eventuell ungenutzen Hard Core verschwendet (Kostenvorteil)
- Einige Softcore sind sehr flexibel konfigurierbar (16/32 Bit Datenpfade, Zusatzmodule, Spezielle Anwenderbefehle etc.)
- Kleine Softcores können je nach Anwendung mehrfach im FPGA parallel platziert und verwendet werden, dadurch erhöht sich die Datenverarbeitungskapazität (z. B. ein RX- und ein TX-Prozessor)
Nachteile:
- Geringere Geschwindigkeit
- Höhere Wärmeverlustleistung
Eigenschaften
Ein soft core wird gern für Displayansteuerungen oder die Konfiguration von Peripheriebausteinen über I2C benutzt. Auf diese Weise kann auch oft schon vorhandener C-Code mitverwendet werden.
Die erreichbaren Taktfrequenzen sind stark vom FPGA-Typ und der FPGA-Auslastung (freie Logikressourcen) abhängig. Mit Softcores können daher typischerweise maximal Datendurchsatzraten in der Größenordnung von 10-20Mbps realisiert werden.
Typen
Eine große Anzahl frei verfügbarer Soft-CPUs gibt es auf OpenCores.org. Die vorhandene Palette reicht von Nachbauten vorhandener Prozessoren, wie des AVR, PIC oder MIPS, bis hin zu eigenen Entwicklungen, wie dem "16 Bit Microcontroller" (c16), der speziell für FPGAs optimiert ist und mit einem eigenen RTOS kommt. Ein anderer ist z. B. der 32-bit OpenRisc 1000, für den eine Version der GNU Tools für die Software Entwicklung zur Verfügung stehen.
Hier soll ein kleiner Überblick über vorhandene Softcores entstehen, für welche Softwarunterstützung existiert und welche Leistungen zu erwarten sind. Es nützt einem oft der tollste Softcore nicht, wenn er sich nicht entsprechend programmieren läßt. Für LatticeMico32, MicroBlaze und NIOS ist jeweils ein Systembuilder verfügbar. Damit lassen sich leicht und übersichtlich Prozessor und Peripherie konfigurieren.
8 Bit Soft Cores
Name | optimiert für | Quellcode | max. Programmspeicher | Programmierung | Toolchain | Leistung | Lizenz/Preis | Weblink |
---|---|---|---|---|---|---|---|---|
AX8 | entfällt | ja, VHDL | 2k (8k) | asm, C, Basic, Ada... | GCC/WinAVR, ... | wie AT90S2313 mit 30-50MHz | OpenCores | |
Xmega/ATmega/ATtiny | entfällt | ja, Verilog | 128 KiB | C, C++, Asm | GCC, Clang | GPL | [1] | |
T51 | entfällt | ja, VHDL | 64k | asm, Basic, C, ... | sdcc, MCS-Basic, ... | single cycle 8051, z. B. 40 MHz auf Spartan3 | OpenCores T51-Core | |
8051 IP Core | entfällt | ja, VHDL | 64k | asm, Basic, C, ... | sdcc, MCS-Basic, ... | 1-4 cycle 8051 | open IP-Core | Oregano Systems |
LatticeMico8 | Lattice | ja, Verilog & VHDL | asm, C | GNU Toolchain | open IP-core | Lattice | ||
PicoBlaze | Xilinx | ja, VHDL | 2k (1024 Befehle) | asm (DOS/ dosbox) | lt. Xilinx 100 MIPS | Xilinx Reference Design License | Xilinx | |
PacoBlaze | entfällt | ja, Verilog | wie PicoBlaze | asm (geschrieben in Java) | KCAsm | wie Picoblaze | modifizierte BSD Lizenz | PacoBlaze |
Panda | entfällt | ja, VHDL | 64k | asm | HASM, Builder SW | je nach Konfiguration | Free IP, Boost | LogicSolutions |
Proteus | entfällt | ja, VHDL | 64k | asm | HASM, Builder SW | je nach Konfiguration | Free IP, Boost | LogicSolutions |
embedded Z8 (UB8820) | XILINX, ASIC syn. | ja, VHDL | 64k | asm | Makroassembler AS | je nach Konfiguration | Free IP | embeddedZ8 site |
bo8 | ja, VHDL | n*64k | asm | BSD0 | bo8 |
Picoblaze
Dabei handelt es sich um einen sehr kleinen, aber dennoch sehr leistungsfähigen Microprozessor.
Eigenschaften:
- nur 76-93 Slices Ressourcenbedarf
- 16 8-Bit Register
- 1024 Befehle Programmspeicher (Version für Spartan-II nur 256 Befehle)
- 18-Bit Befehle, RISC (Version für Spartan-II hat 16-Bit Befehle)
- Alle Befehle dauern zwei Takte
- Interruptunterstützung
- 8-Bit IO-Bus
- Indirekte Addressierung möglich
- Programmspeicher durch Bankumschaltung erweiterbar
- Assembler als Kommandozeilenprogramm verfügbar
- Entwicklungsumgebung pBlazeIDE verfuegbar mit integriertem Assembler
- Schneller Programmdownload über JTAG während der Entwicklung
- 37..102 MIPS, abhängig von der FPGA-Familie
AVR
AX8
Der AX8-Core entspricht fast einem Atmel AT90S2313. Ihm fehlen noch Hardwareeinheiten wie EEPROM, Watchdog und die verschiedenen Powerdown-Modi.
- Ressourcenbedarf: ~ 1400 Xilinx-Slices
- erreichbare Geschwindigkeit auf einem Spartan3-1000: 50 MHz
- als Toolchain kann problemlos WinAVR o.ä. verwendet werden
Die ROM-Beschreibung muss angepasst werden, damit XST einen BlockRAM generieren kann (ein passendes hex2rom gibts hier: hex2rom).
Der Core lässt sich leicht mit Speicher (8KByte ROM), einem EEPROM (bis zu 64KByte), zwei Ports und einem Watchdog erweitern. Damit entspricht der AX8 dann einem AT90S8535, bis auf die anderen Timer/Counter und die fehlende SPI-Schnittstelle.
Für Entwicklungszwecke lässt sich der ROM-Inhalt - wie beim Picoblaze - per JTAG-Schnittstelle updaten. Somit kann neue Software getestet werden, ohne das Design neu zu synthetisieren. Dafür benötigt man die Werkzeuge hex2svf, svf2xsvf und xsvfplayer. Im FPGA füllt dann eine State-Machine am JTAG-Port einen DualPort-RAM (ROM :-))
Im Gegensatz zu neueren AVR-Controllern wie dem ATMega8, fehlen dem AX8-Core Befehle wie MOVW, MUL und FMUL. Außerdem fehlen Hardwareeinheiten, wie I2C und erweiterte Timer. Die größte Beschränkung aber ist der maximale Programmspeicherplatz von 8KByte. Mehr Speicher macht größere Änderungen am VHDL-Code des Cores erforderlich.
AVR8
The AVR8 Soft Processor core is an AVR instruction set compatible processor that is optimized to run on the Butterfly Flight or Butterfly Light FPGA hardware. It is based on the ATmega103 processor and includes a full toolchain to compile and run C code developed with avr-gcc.
http://gadgetfactory.net/gf/project/avr_core/
Softcore für AVR Xmega / ATmega / ATtiny von Iulian Gheorghiu
Neben dem Core selbst sind eine Reihe von AVR-Peripheriebausteinen implementiert. Der Code steht unter GPL.
Eine ältere Version davon ist auch bei OpenCores erhältlich, dort ist der reine Prozessor-Code noch unter eine 1-Klausel-BSD-Lizenz (die Peripherie aber auch dort bereits unter GPL).
https://github.com/MorgothCreator/atmega-xmega-soft-core
Panda
Es steht eine grafische Builder-SW zur Verfügung, um ein System inklusive Peripherien zu generieren, ohne VHDL schreiben zu müssen. Einige Peripherien (Timer, Ports, etc.) sind bereits integriert, eigene Peripherien können in die SW integriert werden. Der Prozessor ist stark konfigurierbar (z. B. Ein/Ausschalten einzelner Instruktionen).
Proteus
Der Prozessor kann durch über 20 Generics perfekt an das Projekt angepasst werden. Es lassen sich beispielsweise Wortbreite, Instruktionen, Pipelining und Register anpassen. Es gibt auch eine JTAG Debugging Software zum Prozessor, die es auch ermöglicht mehrere Prozessoren in einem Chip zu Debuggen. Auch benutzerdefinierte Instruktionen werden unterstützt. Proteus hat für Daten und Instruktionen zwei separate Wishbone Interfaces und ist zu 100% Herstellerunabhängig. In seiner kleinsten Konfiguration benötigt Proteus weniger als 300 LUTs.
embedded Z8 (UB8820/UB8840)
Frei konfigurierbarer Mikrokontroller Core der sich an der Architekture des UB8820/... orientiert (damit dem z8 entsprechend)
Eigenschaften:
- konfigurierbare Anzahl der Registersets
bo8
Die CPU bo8 ist Teil eines auf mikrocontroller.net vorgestellten Gesamt-Projekts. Sie hat einen vollständigen Befehlssatz mit 256 OpCodes. Die Berechnung der Dauer von Befehlsfolgen durch Abzählen von Zyklen ist sehr einfach. Die CPU kann eine unbestimmte Anzahl von 64KByte-Seiten adressieren. Sie hat zwei Takteingänge, die aber an denselben Takt angeschlossen werden können. Nachteilig sind die fehlenden Interrupts und die bisher fehlenden Aussagen zur maximalen Taktfrequenz.
16 Bit Soft Cores
Übersicht
Name | optimiert für | Quellcode | Programmierung | Toolchain | Leistung | Lizenz/Preis | Weblink |
---|---|---|---|---|---|---|---|
NEO430 | generic | Ja, VHDL | asm, C, C++, .. | TI MSP430-gcc (Windows, Linux/Cygwin) | 4-12 cycles per instruction | LGPL | neo430 @ GitHub |
OpenMSP430 | FPGA & ASIC | Ja, Verilog | asm, C, C++, .. | MSPGCC (Windows, Linux/Cygwin) | 1-6 cycles per instruction | BSD | OpenMSP430 @ OpenCores.org |
TG68 | Ja, VHDL | asm, C, C++, .. | GCC, (68k-compatible) | LGPL | tg68 @ OpenCores.org | ||
UCore | Altera | VHDL | Assembler | Assembler, Emulator | single cycle per instruction | Artikel [2] HP [3] |
NEO430
- MSP430-ISA-kompatibel (verwendet TI MSP430-gcc Compiler), 16-bit
- UART / SPI EEPROM Bootloader
- Verschiedene Beispielprogramme und Tutorials
- Hardware (anpassbar): Timer, SPI & UART, Parallel IO, Watchdog, Wishbone Interface, ...
- Leistung: 4..12 Taktzyklen pro Instruktion, ~116MHz (Altera Cyclone IV EP4CE22F17C6N)
- Recourcenbedarf: 700..1200 LE's auf Altera Cyclone IV
- Datenblatt (auf GiHub): NEO430.pdf
OpenMSP430
- MSP430 kompatibel (verwendet MSPGCC Compiler), 16-bit RISC
- FPGA und ASIC erprobt
- Hardware (anpassbar): 16x16 Hardware Multiplier, Watchdog, GPIO, TimerA, generic templates
- two-wire Serial Debug Interface mit Unterstützung des MSPGCC GNU Debugger (GDB)
- Leistung: 1..6 Taktzyklen pro Instruktion
- Recourcenbedarf: Xilinx: 1650 LUTs / Altera: 1550 LEs / ASIC: 8k gate
- Datenblatt (auf opencores.org): openMSP430.pdf
TG68
- 68000 kompatible
- Recourcenbedarf: ~2700 Xilinx Slices, ~4000 LC's auf Altera Cyclone II
32 Bit Soft Cores
Übersicht
Name | optimiert für | Quellcode | Programmierung | Toolchain | Leistung | Lizenz/Preis | Weblink |
---|---|---|---|---|---|---|---|
HiCoVec Vektorprozessor | Xilinx Spartan3A | ja, VHDL | asm, C | GCC, HiCoVec Assembler | Flexible Vektoreinheit | GPL | HS-Augsburg |
LatticeMico32 | Lattice, siehe aber soc-lm32 | ja, Verilog | asm, C, C++ | GCC, MSB | open IP-core | Lattice | |
Leon | Ja, VHDL | asm, C, C++ | GCC (SPARC-compatible) | GPL | Gaisler Research | ||
MicroBlaze | Xilinx | Nein | asm, C, C++ | GCC, EDK | EDK $500/Jahr | Xilinx MicroBlaze bei Wikipedia | |
MicroBlaze MCS | Xilinx | Nein | asm, C, C++ | GCC, SDK | kostenfrei | Xilinx | |
NEORV32 (RISC-V) | generic | ja, VHDL | asm, C, C++ | GCC | BSD | GitHub OpenCores | |
NIOS II | Altera | Nein | asm, C, C++ | GCC, SOPC, EDS | mit Nios II Eval-Kit ab $400, oder $3000 - Nios II/e core free (12/2009) | Altera | |
OpenRISC | Ja, Verilog | asm, C, C++, .. | GCC | OpenCores | |||
Plasma | Ja, VHDL | asm, C, C++ | GCC (MIPS-compatible) | GPL | OpenCores.org | ||
MAIS | Ja, VHDL | asm, C, C++ | GCC | Creative Commons CC BY-NC 3.0 with exception commercial applicants have to pay a licence fee | [4] | ||
Propeller 2 | Ja, VHDL | C, | Parallax IDE | GPL3 | [5] | ||
Zylin CPU (ZPU) | Ja, VHDL | asm, C, C++ | GCC | FreeBSD/GPL | Zylin.com | ||
f32c (RISC-V / MIPS) | Lattice, Altera, Xilinx | Ja, VHDL | asm, C, C++ | GCC, Arduino IDE | 1.63 DMIPS/MHz, 3.06 CoreMark/MHz | BSD | f32c |
PULPino (RISC-V) | ASIC, Xilinx | Ja, SystemVerilog | asm, C, C++, .. | GCC, LLVM | MIT | pulp-platform |
Einen ersten Eindruck von derLeistungsfähigkeit der 32 Bit SoftCores gibt z. B. die Master-Arbeit "Evaluation of synthesizable CPU cores" aus dem Jahr 2004. Diese Vergleicht den Leon 2, MicroBlaze und OpenRISC 1200 miteinander.
Lattice Mico32 und soc-lm32
Mico32 ist eine 32 Bit pipelined RISC CPU. Die steht unter einer OpenSource Lizenz und liegt komplett im Verilog Quelltext vor. Sowohl die CPU Architektur als auch der Resourcenbedarf ist vergleichbar mit dem MicroBlaze von Xilinx, ist allerdings eine eigenständige Entwicklung von Lattice.
- Recourcenbedarf: ~1600 Slices (Lattice/Xilinx)
- Erreicht ca. 80-116MHz auf ECP2 und XP2 Devices von Lattice und ca. 100 MHz auf Spartan3 Generation FPGAs,
- Konfigurierbare D- und I-Caches (aus BRAM oder Distributed RAM)
- 2 Wishbone-Interfaces: Für Daten-Load&Store und Instruction-Fetch
- Systembuilder mit automatisch erstellten Wishbone Arbitern
- Keine Begrenzung in Anzahl der benutzten Wishbone Busse
- Kompletter GNU Toolchain aus binutils, gcc und gdb
- Eclipse Entwicklungsumgebung, gemanagte C und C++ Entwicklung
- Automatische Treibererstellung durch den Systembuilder
- In Lattice Bausteinen gleichzeitige Benutzung des Logikanalyzers und Debuggers
Neben dem Original, das man von Lattice herunterladen kann, und dessen Toolchain erstmal auf Windows mit Lattice FPGAs ausgelegt ist, gibt es noch soc-lm32. soc-lm32 ist eine Portierung auf Altera und Xilinx Bausteine und benutzt einen Makefile-basierten Workflow.
Eine von Lattice in Auftrag gegebene Portierung von uC-Linux ist verfügbar (http://www.theobroma-systems.com/mico32/).
Nachteile: bis jetzt gibt es keine Version mit FPU (kann über Wishbone als Peripherie angeflanscht werden) oder MMU.
Kommentar dazu: single precision Arithmetik Module in VERILOG (fadd, fsub, fmul, fdiv, flog, fexp sowie Konvertierung) gibt's bei : https://www.linkedin.com/in/till-wallendorf-32754b134
Leon
Dieser Prozessorkern ist komplett SPARC V8 kompatibel -- beliebige SPARC Compiler können verwendet werden (z. B. bcc, ). Neben dem Kern selbst steht auch eine breite Auswahl an Peripherie in Form von VHDL-Komponenten zur Vefügung. Als On-Chip Interconnect kommt AMBA (AHB + APB) zum Einsatz.
- Recourcenbedarf: ~4000 Xilinx Slices, 10 BRAMs (minimal-konfiguration)
- Erreicht ca. 50 MHz auf Spartan3 Generation FPGAs
MicroBlaze & Nachbauten
MicroBlaze ist ein Core der von der Firma Xilinx speziell für deren FPGAs zur Verfügung gestellt wird. Er ist u.a. mit der XPS-Software instanziier- und konfigurierbar. Die Softwareentwicklung erfolgt in C mittels der Software EDK.
Microblaze ist im Gegensatz zu PicoBlaze kommerziell und erfordert eine Lizenz. Allerdings hat Xilinx beginnend mit der ISE 13.4. einen leichtgewichtigen Microblaze - MicroBlaze MCS - veröffentlicht der kostenfrei für alle Xilinx FPGA's (mglw außer den prähistorischen Relikten wie Spartan XL?!) verwendbar ist:
http://www.xilinx.com/tools/mb_mcs.htm
Dieser wird mit dem CoreGen statt dem EDK generiert, zum programmieren (C/C++) stellt Xilinx ein SDK bereit.
NEORV32
RISC-V basierter 32-bit soft-core Mikrocontroller, "großer Bruder" vom NEO430, verfügbar auf GitHub
- Anpassbare Hardwarekonfiguration (über generics)
- Plattform-unabhängige Beschreibung in VHDL (getestet auf Intel-, Xilinx- und Lattice-FPGAs)
- Optionale Peripheriemodule: Timer, Watchdog, SPI, UARTs, I²C, TRNG, Execute in Place über SPI, natives NeoPixel-Interface, GPIO, PWM, Bootloader, interne Speicher / Caches, Wishbone/AXI4-Lite Bus-Interface
- online Dokumentation
- Software-Framework (Doku auf GitHub-pages)
- On-Chip Debugger mit JTAG-Interface
- 0,9 Coremarks/Mhz bei ~2700 (CPU) Intel Cyclone IV LUTs bei 124 MHz
RISC-V Erweiterung | Beschreibung |
---|---|
A (atomic) | Atomarer Speicherzugriff (optional) |
B (bit-manipulation) | Bit- Manipulationsinstruktionen (optional) |
C (compressed) | 16-bit komprimierte Instruktionen (optional) |
E (embedded) | Reduziertes Register-File - 16 statt 32 Register (optional) |
I (integer-base) | Integer-Basis-ISA |
M (mul-div) | Hardware-Multiplizierer und -Dividierer (optional) |
U (user-mode) | User-Mode mit reduzierten Rechten (optional) |
Zfinx (floating-point) | 32-bit single-precision Floating-Point Hardware (optional) |
Zicsr (privilege-base) | Kontroll- und Statusregister - z.B. für Interrupts/Traps/Exceptions (optional) |
Zifencei (I-sync) | Instruktionsstream Synchronisation - z.B. für selbst-modifizierenden Code (optional) |
PMP | Physikalischer Speicherschutz (optional) |
HPM | Hardware Performance Monitors - z.B. für Benchmarking (optional) |
Propeller
Komplettes Open Source Paket aus SoftCore, IDE und Debugging des Propeller 2 uCs: http://de.wikipedia.org/wiki/Parallax_Propeller http://www.parallax.com/microcontrollers/propeller-1-open-source
ZPU
http://www.mikrocontroller.net/articles/ZPU:_Softcore_Implementierung_auf_Spartan-3_FPGA
64 Bit Soft Cores
OpenSPARC T1
www.oracle.com/technetwork/systems/opensparc/index.html
128 Bit Soft Cores
Inzwischen werden für spezielle Andwendungen auch 128-Bit Softcores als RISC Prozessoren verwendet. Siehe:
Weblinks
http://en.wikipedia.org/wiki/Soft_microprocessor
Erste Schritte mit Leon3, OpenRISC 1200, Nios II und MicroBlaze: http://www.rte.se/blog/blogg-modesty-corex/index