Microchip CLB – erste Versuche zur „FPGA-Zelle“ im Achtbitter

OP (Firma: Tamoggemon Holding k.s.) #7609745
Lesenswert?

Microchip erweitert das Achtbitter-Portfolio permanent um innovative Peripheriegeräte, die Entwicklern das Auslagern von Rechenaufgaben vom Kern an die Core Independent Peripherals erlauben. Mit dem PIC16F13145 steht eine logische Weiterentwicklung der CLC an – dieser Artikel wirft einen ersten Blick auf die als Configurable Logic Block bezeichnete Engine und vergleicht ihn mit der CLC.

Worum geht es hier

Mit der in der ersten Abbildung gezeigten CLC wagte Microchip den ersten Schritt in die Welt der „konfigurierbaren Logik“. Der blaue Block konnte dabei verschiedene Aufgaben übernehmen, die eine „Vermaschung“ der anliegenden Signale ohne Eingriff von Seiten des Rechenkerns erledigten.

Bildquelle: https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8bit-pic/peripherals/clc/

Ob der sehr rigiden Struktur war der Einsatzbereich des Moduls streng limitiert. Mit der CLB setzt Microchip stattdessen auf eine matrizierte Struktur, die – wie in der Abbildung gezeigt – bis zu 32 „flexible Funktionseinheiten“ zur Verfügung stellt.

Bildquelle: Microchip

Exkurs: Online-Bitstromgenerator

Microchip bietet unter der URL https://logic.microchip.com/clbsynthesizer/ ein im Browser lebendes Synthesewerkzeug an. Es ermöglicht die Generierung von Gatterschaltungen und ermöglicht auch ihre – teilweise – Verdrahtung mit Eingangs- und Ausgangssignalen.

Bildquelle: Autor

Über CLB Synthesizer → Save Design lässt sich eine .clb-Datei exportieren, die danach in verschiedenen anderen Werkzeugen ladbar ist. In der Praxis ist das System allerdings eher wenig nützlich, da die eigentliche Entwicklung in MPLAB erfolgt.

Erste Versuche und Beschaffung

Als der Autor die Arbeiten an diesem Artikel begann, waren die Bauteile nur als Samples bei Microchip verfügbar. Die Lieferung der drei PIC16F13145-I/SS erfolgte zollschonend aus Thailand mit einem Zwischenstop in Frankreich; im Moment ergibt eine OEMSecrets-Suche nach wie vor keine Lieferbarkeiten außerhalb von Microchip.

Bildquelle: https://www.oemsecrets.com/compare/PIC16F13145

Wie bei den Achtbittern üblich plant Microchip auch hier das Anbieten einer DIP-Variante. Im Datenblatt findet sich außerdem der hier tabellarisch gezeigte Speisezettel.

Bildquelle: Microchip

Mit einem Adapter ist es problemlos möglich, eine primitive Entwicklungsplatine zu konstruieren. Wichtig ist vor Allem die Verwendung einer brandaktuellen Version von MPLab (hier 6.20), als Kommandogerät soll ein PicKit4 zum Einsatz kommen. Nach dem erfolgreichen Abarbeiten des Projektgeneratorassistenten (man achte auf eine brandaktuelle Version von XC8) öffnen wir MCC und fügen in der Rubrik Device Resources das Modul CLB1 zum Projekt hinzu. Lohn der Mühen ist das Erscheinen der in der Abbildung gezeigten Oberfläche, die eine lokale Version des CLB Synthesizer einbindet.

Bildquelle: Autor

Für einen ersten Versuch bietet siich die Auswahl des Beispiels Invert a Signal an. Ein Doppelklick auf den Tabheader ermöglicht den Wechsel in den Vollschirmmodus, der dringend empfehlenswert ist.

Bildquelle: Autor

Nach einem Klick auf das unten links befindliche Synthesize-Steuerelement erscheint ein grüner Haken und eine Art Fortschrittsbalken, der über die „Menge“ der verbrauchten Logikblöcke informiert. Schließen Sie das CLB-Fenster danach, um im normalen Project Resources-Fenster weiterzuarbeiten. In der Pin Grid View-Anzeige scheinen die Ein- und Ausgangspins dann zur Ansteuerung bzw Zuweisung auf – die Aktualisierung erfolgt erst nach (!) dem Schließen des CLB-Fensters (!!!).

Bildquelle: Autor

Die vom Autor verwendete Belegung präsentiert sich wie in der Abbildung gezeigt.

Bildquelle: Autor

Betrachtung des Codes

Ist die Generation des Codes erfolgreich verlaufen, so entsteht im Unterordner MCC Generated Files die Struktur clb/src. In clbBitstream.s findet sich eine nach folgendem Schema aufgebaute Bitstromdatei:

1
GLOBAL  _start_clb_config
2
GLOBAL  _end_clb_config
3

4
PSECT  clb_config,global,class=STRCODE,delta=2,noexec,split=0,merge=0,keep
5

6
_start_clb_config:
7
    DW  0x0000
8
    DW  0x0000
9
    DW  0x0000
10
    DW  0x0000
11
    DW  0x0000
12
    DW  0x0000
13
    DW  0x0000
14
    DW  0x0000
15
    DW  0x0000
16
    . . . .

Die eigentliche Logik findet sich in clb1.c – interessant ist vor Allem die folgende Methode, die sich um die Initialisierung des CLB kümmert:

1
void CLB1_Configure(uint16_t start_address)
2
{
3

4
    uint16_t end_address;
5

6
    end_address = start_address + 102;
7

8
    // Set the bitstream address
9
    CRC_SetScannerAddressLimit(start_address, end_address);
10

11
    // Start CLB bitstream load
12
    CRC_StartNvmScanner();
13

14
    // Wait to complete
15
    while (CRC_IsScannerBusy());
16

17
    // Switch back to the CRC peripheral
18
    CRC_StopNvmScanner();
19
}

Die Aktivierung der Lademethode erfolgt separat:

1
void CLB1_Initialize(void)
2
{
3
    /* Disable CLB */
4
    CLBCONbits.CLBEN = 0;
5

6
    //Load the bitstream
7
    CLB1_Configure((uint16_t) &start_clb_config);
8

9
    /* CLK HFINTOSC; */
10
    CLBCLK = 0x6;
11

12
    /* OESEL0 0; OESEL1 0; */
13
    CLBPPSCON1 = 0x0;
14

15
    /* OESEL2 0; OESEL3 0; */
16
    CLBPPSCON2 = 0x0;
17

18
    /* OESEL4 0; OESEL5 0; */
19
    CLBPPSCON3 = 0x0;
20

21
    /* OESEL6 0; OESEL7 0; */
22
    CLBPPSCON4 = 0x0;
23

24
    // Clearing CLB1I0 IF flag.
25
    PIR7bits.CLB1IF0 = 0;
26
    // Disabled CLB1I0 CLB1 interrupt
27
    PIE7bits.CLB1IE0 = 0;
28

29
    // Clearing CLB1I1 IF flag.
30
    PIR7bits.CLB1IF1 = 0;
31
    // Disabled CLB1I1 CLB1 interrupt
32
    PIE7bits.CLB1IE1 = 0;
33

34
    // Clearing CLB1I2 IF flag.
35
    PIR7bits.CLB1IF2 = 0;
36
    // Disabled CLB1I2 CLB1 interrupt
37
    PIE7bits.CLB1IE2 = 0;
38

39
    // Clearing CLB1I3 IF flag.
40
    PIR7bits.CLB1IF3 = 0;
41
    // Disabled CLB1I3 CLB1 interrupt
42
    PIE7bits.CLB1IE3 = 0;
43

44
    /* EN enabled; */
45
    CLBCON = 0x80;
46

47
}

Um den eigentlichen Aufruf kümmert sich dann folgende Methode:

1
void SYSTEM_Initialize(void)
2
{
3
    CLOCK_Initialize();
4
    CLB1_Initialize();
5
    PIN_MANAGER_Initialize();
6
    CRC_Initialize();
7
    NVM_Initialize();
8
    INTERRUPT_Initialize();
9
}

Ebenda finden sich auch einige Methoden, die die Kommunikation mit den 32 bit breiten „Steuerregistern“ ermöglichen. Aus Sicht der Recheneinheit stehen zwei Registergruppen aus je vier Kernregistern zur Verfügung, die wie in der Abbildung gezeigt mit den diversen Funktionseinheiten verdrahtet werden. Hier als Auszug eine der Beispielmethoden:

1
void CLB1_SWIN_Write8(uint8_t data)
2
{
3
    //wait for CLBSWIN register to be synchronized
4
    while (CLB1_IsCLBSWINBusy());
5

6
    CLBSWINL = data;
7
}

Wie geht es weiter?

Nachdem wir uns die grundlegende Struktur eines CLB-basierten Projekts angesehen haben, ist es nun an der Zeit, in die Praxis überzugehen. Dies ist Thema eines Folgeartikels – über eventuelle Fragen und Testwünsche freut sich der Autor wie immer im Kommentarbereich.

Angehängte Dateien:

Kommentare

#7610523
Lesenswert?

🍅🍅 🍅. schrieb:

Zynq für Arme/Dumme?

Lichtjahre davon entfernt. Sieh dir mal eine einzelne Zelle an, und vergleiche sie mit einer LUT/LE. Und richtig neu ist es eigentlich auch nicht. Statt 4 CLC-Zellen wie bei einem 16F1509 sind es jetzt halt 32 und das ganze heisst jetzt CLB. Ganz unnuetz sind diese 4 CLC-Zellen zumindest nicht.

Ein UPSD3233/4, dass ist ein 8051-Derivat von ST, hat auch ein PLD. Dort z.B. zur externen Adressdekodierung ausgesprochen nuetzlich. Das hat aber auch 3000 Gates mit 16 Macrozellen. Leider abgekuendigt...

#7610820
Lesenswert?

Es gab damals doch die FPSLIC... ein AVR in Kombination mit einem FPGA.

Oder auch ein RP2040 (PIO) und 68332(TPU) geht auch in die Richtung, wenn vielleicht auch nicht ganz so flexibel. Oder die PSOCs, es gab da in den letzten 20Jahren immer wieder Ansaetze. Aber so eine richtig grosse Verbreitung hat es irgendwie nie gefunden.

Man braucht sowas vermutlich nicht oft, aber wenn dann kann es sehr nuetzlich sein. Allerdings mit MPLAP auf einem Pfui-Betriebsystem mit Gattern rumdroesseln? Ne, dann schreib ich das lieber in abgehalfterten Assembler fuer den RP2040.

Vanye

Gast #7610828
Lesenswert?

Vanye R. schrieb:

Man braucht sowas vermutlich nicht oft

Letztlich sind das nur halbe Lösungen. Schaut man sich an was damit gebaut werden soll kommt man entweder zum Schluss es ginge in Software genauso oder das Peripheral was man damit oft aufwertet hätte die Funktionalität gleich selber mitbringen können.

#7610829
Lesenswert?

Vanye R. schrieb:

Man braucht sowas vermutlich nicht oft, aber wenn dann kann es sehr nuetzlich sein. Allerdings mit MPLAP auf einem Pfui-Betriebsystem mit Gattern rumdroesseln? Ne, dann schreib ich das lieber in abgehalfterten Assembler fuer den RP2040.

Fuer die CLC gab/gibt es den CLC-Designer. Der braucht kein MPLAB(X). Wuenschenswerter Weise rafft Microchip sich zu etwas aehnlichem fuer die CLBs auf.

Und wenn man wirklich einen FPGA im Design haben moechte oder muss, dann will, oder braucht man regelmaessig auch wesentlich mehr IOs als die "sparsamen" 32(?) GPIOs eines RP2040 oder eines PIC. Der skaliert naemlich ueberhaupt nicht. Selbst die "kleine" MAX10 Serie kennt aber Packages mit 500 IOs.

Was sicherlich interessant waere, waeren ein oder mehrere FP-DSPs wie in den TI daVincis, verbunden mit aktuelleren ARM-Kern(en) und 50 k LEs im FPGA. Die DSPs waeren eine sehr hilfreiche Ergaenzung.

#7610915
Lesenswert?

Hallo,

zur Info. Reichelt hat Artikel-Nr.: PIC16F13145-ISS (SSOP-20) verfügbar und Artikel-Nr.: EV06M52A (Curiosity Nano Evaluation Kit PIC16F13145). Wobei letzteres ganz schön teuer ist. Wer kann sollte das direkt von Microchip beziehen. Ggf. noch einen Coupon suchen. CLC finde ich generell gut. Man kann damit viel machen ohne das es Unterbrechungen oder Verzögerungen durch Softwarerechenoperationen / Interrupts gibt. Je mehr die Möglichkeiten damit ausgebaut werden umso komplizierter wird allerdings die Nutzung dessen. Es wird eine Gradwanderung bleiben. Der Profi könnte dann lieber zu einem FPGA greifen und hat alle Freiheiten und der Hobbyist lässt es links liegen, weil Einstiegshürde zu hoch. Mir würde es reichen eine leicht aufgebohrte Variante zu haben die ich vom AVRxDB o.ä. kenne. Mit noch paar Kombinationsmöglichkeiten mehr und der Wahlfreiheit ob Puls- oder Level-Event für alle Event-Generatoren. Damit kann man schon Allerhand anfangen.

Generell hätte diese Serie hier aber zu wenig RAM für mich. ;-) Wie ordnet man diese PICs überhaupt ein? Aufgebohrte ATtiny Serie?

#7611000
Lesenswert?

Und wenn man wirklich einen FPGA im Design haben moechte oder muss, dann will, oder braucht man regelmaessig auch wesentlich mehr IOs als die "sparsamen" 32(?) GPIOs eines RP2040 oder eines PIC.

Nein, mir faellt das sofort eine Anwendung ein wo das nicht so ist, kann ich aber wegen Firma und so hier nicht erzaehlen.

Wie schon gesagt, es ist selten sinnvoll, aber wenn doch kann es sehr cool sein.

Vane

#7611344
Lesenswert?

Die Version mit den 4 "Makrozellen" gibt es auch in der AVR-Famile, habe ich mal in einem ATmega4808 benutzt. Heißt dort CCL, für Configurable Custom Logic. Selbst ganz kleine moderne ATtiny haben 2 solche Zellen.

Im Zusammenspiel mit dessen Event System ganz nützlich, um sich z.B. eine eigene Interrupt-Quelle für Hard Realtime zu verknüpfen. (Konkret habe ich ein schnelles Signal auf Taktänderungen überwacht, mit 2 Timern ein "Fenster" definiert und mit den CCL-Zellen einen Interrupt ausgelöst wenn sich eine Flanke außerhalb der Fenster befindet.)

Von einem FPGA ist das aber weit entfernt. Es gehen nur ganz einfache Verknüpfungen. Hilfreich war, dass man auch interne Signale der anderen uC-Peripherie mit einbeziehen kann. Auf 32 Zellen aufgebohrt ginge dann etwas mehr, so etwa auf dem Level der frühen konfigurierbaren Logik (PALs, GALs).

Für andere Anwendungen suche ich tatsächlich low-pincount FPGAs, in nicht-BGA Gehäuse. Aussichtsreichster Kandidat ist Lattice ICE40UP5K im QFN48-Gehäuse. Da soll man auch schon einen kleinen RISC-V mit reinsynthetisiert bekommen, läuft vermutlich bereits den 8-Bittern davon. Auch interessant aber m.W. nicht einzeln als nackte Chips erhältlich sind Chips von GoWin. Die älteren (GW1NSR-LV4C) haben einen ARM Cortex-M3 mit drin, die neueren (GW1NR-9) sparen sich wohl die Lizenzkosten und verlassen sich auf RISC-V Softcore Möglichkeit. (Sorry für die Abschweifung)

#7611429
Lesenswert?

Veit D. schrieb:

Wie ordnet man diese PICs überhaupt ein? Aufgebohrte ATtiny Serie?

Man koennte sich am ausgeschriebenen Akronym orientieren. Es sind Computer!

Was noch nicht erwaehnt wurde: Man kann die/eine CLC auch zur Laufzeit umprogrammieren. Um z.B. eine Negation "wegzukonfigurieren". Wenn einem das nuetzlich erscheint. Man muss aber aufpassen, dass man sich keine Glitche einfaengt. :)

Angehängte Dateien:
OP (Firma: Tamoggemon Holding k.s.) #7611957
Lesenswert?

Motopick schrieb:

Veit D. schrieb:

Wie ordnet man diese PICs überhaupt ein? Aufgebohrte ATtiny Serie?

Man koennte sich am ausgeschriebenen Akronym orientieren. Es sind Computer!

Was noch nicht erwaehnt wurde: Man kann die/eine CLC auch zur Laufzeit umprogrammieren. Um z.B. eine Negation "wegzukonfigurieren". Wenn einem das nuetzlich erscheint. Man muss aber aufpassen, dass man sich keine Glitche einfaengt. :)

Hallo, ja, sowohl CLC als auch CLB sind dynamisch rekonfigurierbar.

Bei der CLB kannst du auch eines der Bits im Kontrollregister zum "Umstellen" verwenden, ohne den Bitstrom neu zu laden

OP (Firma: Tamoggemon Holding k.s.) #7611958
Lesenswert?

Jörg H. schrieb:

Die Version mit den 4 "Makrozellen" gibt es auch in der AVR-Famile, habe ich mal in einem ATmega4808 benutzt. Heißt dort CCL, für Configurable Custom Logic. Selbst ganz kleine moderne ATtiny haben 2 solche Zellen.

Die CLB wird sehr bald auch für AVR rauskommen, mE nach. Ich weiss nix offizielles aber...bisher war es so...

OP (Firma: Tamoggemon Holding k.s.) #7611959
Lesenswert?

Motopick schrieb:

Vanye R. schrieb:

Man braucht sowas vermutlich nicht oft, aber wenn dann kann es sehr nuetzlich sein. Allerdings mit MPLAP auf einem Pfui-Betriebsystem mit Gattern rumdroesseln? Ne, dann schreib ich das lieber in abgehalfterten Assembler fuer den RP2040.

Fuer die CLC gab/gibt es den CLC-Designer. Der braucht kein MPLAB(X). Wuenschenswerter Weise rafft Microchip sich zu etwas aehnlichem fuer die CLBs auf.

Gibt es online, den CLB Synthesizer.

#7614015
Lesenswert?

Hoffentlich gibt es das bald auch für AVR. Die CCL dort konnte ich schon gut gebrauchen. Aber bei einigen Projekten hätte ich etwas mehr Logikelemente gebraucht und musste so auf ein zusätzliches CPLD ausweichen. Das macht dann eine weiter Toolchain und ein zusätzliches Programmierinterface nötig. Alles im Microcontroller integriert wäre echt praktisch.

#7636129
Lesenswert?

Für den Arbeitsalltag im Team und das automatisierte Bauen von Firmware sind Beschreibungen als Quellcode viel besser geeignet und kosten nach entsprechender Einarbeitung viel weniger Zeit.

Das sehe ich genauso. Man koennte ja auch einen Mittelweg gehen der auf einem grafischen Tool dann den Quellcode generiert, also alles offen laesst.

Vanye

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren