Come ottimizzare i sistemi embedded con la logica e la flessibilità delle periferiche hardware: guida completa

di: Robert Perkel

Panoramica: le periferiche con logica e flessibilità on-chip e migliorano le applicazioni riducendo le dimensioni del codice, riducendo il consumo energetico e migliorando le prestazioni del sistema implementando logica discreta and/or collegando insieme altre periferiche.

Le periferiche hardware on-chip sono ben note per la loro capacità di ridurre il consumo energetico, migliorare le prestazioni, aumentare le capacità del dispositivo e ridurre le dimensioni del codice. Queste periferiche sono disponibili in una varietà di opzioni, dagli Operational Amplifier e Enhanced Analog ai Digital Converter (ADC) ai Pulse Width Modulator (PWM) e Universal Timer (UTMR). Uno dei tipi più potenti di queste periferiche è quello in grado di implementare una logica discreta o di collegare
tra loro altre periferiche. Questo articolo esplorerà le periferiche Configurable Logic Cell (CLC), Configurable Custom Logic (CCL), Event System (EVSYS) e Signal Routing (SR) Port e come possono essere utilizzate per aggiungere valore al tuo progetto.

 

CLC / CCL

Le periferiche Configurable Logic Cell (CLC) e Configurable Custom Logic (CCL) sono delle Look-Up Table (LUT) programmabili, ciascuna delle quali è efficacemente equivalente a una singola cella di FPGA. La funzione logica configurata all’interno di ciascuna istanza periferica è definita in fase di esecuzione. CLC/CCL possono funzionare indipendentemente dalla CPU, il che gli consente di sostituire i chip logici discreti nella progettazione. Per quanto riguarda la differenza tra CLC e CCL, ci sono piccole differenze di implementazione: il CLC è specifico per il microcontroller PIC® mentre il CCL è specifico per il microcontroller AVR®. Tuttavia, il funzionamento di base di ciascuna periferica rimane lo stesso.

 

Pulsanti e Commutatori di Debouncing

Uno dei casi d’uso più comuni per CLC/CCL è l’implementazione di debouncing a livello hardware in combinazione con un timer/oscillatore. La Application Note 2805 (AN2805) discute tre modi per implementare il debouncing utilizzando CLC. Dei tre, le due versioni CLC raggiungono un buon equilibrio tra l’utilizzo delle risorse hardware e le prestazioni. Il codice sorgente per le tre versioni è disponibile su Github.

Per implementare il debouncer, uno dei CLC è impostato come un D flip-flop per bloccare il valore dal pulsante o dal commutarore. Il secondo CLC rende logicamente AND il valore bloccato dalla fase precedente con l’input diretto e quindi blocca il valore risultante. La sorgente di clock per entrambi i flip-flop è una sorgente di clock a bassa frequenza generata da un timer o oscillatore sul dispositivo. Di seguito viene illustrata l’implementazione.

                                      Figura 1 – Due CLC Debouncer

 

Per le CCL sulle MCU AVR, è ancora più semplice. Le CCL contengono un’opzione di filtraggio in ingresso che esegue efficacemente la stessa operazione di filtraggio a due cicli implementata sui CLC. Inoltre, le CCL possono essere sincronizzate da un oscillatore a 1 kHz sul dispositivo, che è abbastanza lento da eseguire il debouncing.

 

Decodifica in Quadratura

Un altro caso d’uso delle CLC consiste nell’eseguire la decodifica in quadratura. Gli encoder incrementali in quadratura generano due onde quadre in cui una fase precede l’altra di 90 gradi. La quantità di rotazione è determinata dal numero di forme d’onda, mentre la fase della forma d’onda indica la direzione. L’immagine seguente mostra un esempio di segnale codificato in quadratura.

                                   Figura 2 – Esempio di forma d’onda in quadratura

 

Per decodificare questo, le CLC convertono questa forma d’onda in due uscite, che rappresentano impulsi in senso orario e antiorario. Due timer nel microcontroller contano il numero di impulsi ricevuti. Quando il microcontroller deve conoscere il cambiamento netto di posizione, è possibile eseguire alcuni semplici calcoli sui conteggi di ciascun timer per determinare il cambiamento netto dall’ultima lettura.

 

Event System

L’Event System (EVSYS) è progettato per selezionare un segnale in uscita da un’altra periferica e indirizzarlo ad altre periferiche interne al microcontroller. Questa interconnettività può avvenire indipendentemente dalla CPU, il che consente di risparmiare energia in modalità sleep o idle e migliora le prestazioni. L’EVSYS si trova solo nei microcontroller AVR.

 

SR Port

Sui microcontroller PIC, esiste una periferica nota come Signal Routing (SR) Port. La SR Port è una struttura simile a una porta I/O di uscita ma interiorizzata. Il software può essere utilizzato per impostare o cancellare manualmente i bit all’interno, come un registro di uscita I/O standard, ma supporta anche i segnali di uscita periferici e la funzionalità del registro a scorrimento.

La SR Port funziona bene anche con la funzione Peripheral Pin Select (PPS) che si trova anche sui microcontroller PIC. PPS offre flessibilità al progettista nell’assegnazione di I/O consentendo ai segnali di I/O digitali di essere spostati su diversi pin del microcontroller. Allo stesso modo, PPS consente alle periferiche di selezionare singolarmente i “pin” della SR Port come ingressi. Ciò consente di costruire e controllare macchine a stato avanzato utilizzando questa periferica.

On-Device Signal Select

Un possibile caso d’uso per SR Port e CLC è implementare un multiplexer di selezione del segnale interno. Questo potrebbe essere utilizzato per l’autotest interno o per selezionare uno degli N segnali da elaborare. Per implementare ciò, viene utilizzato un CLC per creare un multiplexer 2:1. È possibile anche un multiplexer 4:1, ma ciò utilizza tre CLC e due bit dalla SR Port. Per controllare il multiplexer, un bit dalla porta SR viene utilizzato come linea di selezione. L’implementazione logica è mostrata di seguito.

Figura 3 – Multiplexer 2:1 (come implementato all’interno della logica CLC; ingressi inutilizzati nascosti)

 

Un vantaggio che questa implementazione ha rispetto a PPS è la velocità e la flessibilità. PPS può essere bloccato per evitare modifiche involontarie in fase di esecuzione. Inoltre, è possibile impostare un bit di configurazione per assicurarsi che il PPS sia sbloccabile solo una volta. Invece, la configurazione del multiplexer CLC consente al programma di modificare gli ingressi senza passare attraverso una sequenza di sblocco ogni volta. Questo caso d’uso viene utilizzato nella Morse Code demo per la famiglia PIC18F56Q71 family di Microchip. La demo crea un semplice trasmettitore e ricevitore di codice morse: il multiplexer viene utilizzato per selezionare tra l’uscita del trasmettitore e un segnale di ingresso esterno per la ricezione.

 Figura 4 – Schema a Blocchi della Demo del Codice Morse

 

All’interno del programma, le macro single bit set/clear/toggle per i pin della SR Port sono definite per la leggibilità.

//Select input to decoder
#define SELECT_TX_DECODE() do { RW0_SetLow(); } while(0)
#define SELECT_USER_DECODE() do { RW0_SetHigh(); } while(0)
#define SWITCH_DECODE_SOURCE() do { RW0_Toggle(); } while(0)

di codice riportato di seguito è responsabile della pulizia della commutazione tra le fonti di ingresso. Quando il trasmettitore e il ricevitore sono idle e l’utente ha inviato un ‘#’’ al terminale, cambierà le sorgenti di ingresso.

if (morseTx_isSwitchRequested() && morseRx_isIdle() && morseTx_isIdle())
{
//Request to switch input sources
SWITCH_DECODE_SOURCE();
morseTx_clearSwitchRequest();

if (IS_USER_INPUT_ACTIVE())
{
//User Input
printf( “User input is now active.\r\n” );
}
else
{
//TX Input
printf(“Transmitter input is now active.\r\n” );
}
}
Il codice sorgente di questo programma è disponibile su Github.

 

Calcolo Parità con Accelerazione Hardware

In alcuni casi, è necessario generare un bit di parità per la trasmissione o la comunicazione dei dati. Calcolare la parità nel software è banale, ma più lento da eseguire rispetto all’hardware. Di seguito viene mostrata una semplice funzione.

Nota: il modello di test valutato viene memorizzato a livello globale per questi semplici esempi.

bool isOdd_SW(void)
{
bool isOdd = false;
uint8_t temp;

//Byte Scan
for (uint8_t byIndex = 0; byIndex < DATA_SCAN_LENGTH; byIndex++)
{
//Bit Scan
temp = data[byIndex];
for (uint8_t biIndex = 0; biIndex != 8; biIndex++)
{
if (temp & 0b1)
{
//Count
isOdd = !isOdd;
}

//Shift bits
temp >>= 1;
}
}
return (isOdd);

}

Per accelerare il calcolo, una periferica SPI può essere utilizzata con un CLC per costruire un calcolatore di parità hardware. L’hardware SPI contiene un registro a scorrimento seriale per trasmettere e ricevere dati. L’output dell’hardware SPI (il registro a scorrimento) può essere inserito in un CLC per creare un calcolatore di parità che funziona a un ritmo sostanzialmente più veloce rispetto alla versione del software.

    Figura 5 – Implementazione Hardware

 

Questa implementazione può anche riutilizzare una periferica SPI esistente, riducendo ulteriormente i costi di implementazione. Questo perché normalmente la linea Chip Select (CS) deve essere impostata per comunicare con altri dispositivi SPI. Ma, se non viene asserito, la comunicazione viene ignorata.

Per eseguire la versione accelerata dall’hardware, è necessario acquisire prima il valore corrente bloccato nel CLC, quindi, trasmettere i dati da parità calcolati con CS de-asserito, quindi, osservare il nuovo valore bloccato nel CLC. Se il nuovo valore è uguale al valore precedente, è stato contato un numero pari di uno. Se i valori non corrispondono, era un numero dispari. Il software per calcolare una disparità è mostrato di seguito.

bool isOdd_HW(void)
{
bool initialState = CLC3_OutputStatusGet();
SPI1_BufferWrite(&data[0], DATA_SCAN_LENGTH);
return (!(CLC3_OutputStatusGet() == initialState));
}

Per dimostrare il vantaggio della velocità, è stato costruito un piccolo programma dimostrativo basato sulla famiglia di microcontroller PIC16F18146 di Microchip. Uno dei timer interni, il Timer 1, viene utilizzato per contare il numero di cicli di clock (F OSC /4) necessari per eseguire i calcoli di parità hardware e software. I risultati vengono stampati su un terminale seriale per ‘analisi. Una copia dei risultati delle prestazioni a diversi livelli di ottimizzazione del compilatore è inclusa di seguito.

 

Tabella 1 – Differenze di prestazioni tra implementazioni software e hardware, sequenza a 10 byte

Optimization
Level
Software
Time
Hardware
Time
Performance Difference
(%)
Level 0 (None) 1726 552 +313%
Level 1 1371 533 +257%
Level 2 1371 533 +257%
Level 3 (Speed) 1019 465 +219%
Level S (Size) 1019 465 +219%

 

Il miglioramento delle prestazioni mostrato in questo esempio dipende dalle velocità di clock del microcontroller e da quelle della periferica SPI. Il codice sorgente di questo programma è disponibile su Github.

 

Riflessioni Conclusive

Le periferiche hardware sono una caratteristica importante nei sistemi embedded. Usandoli, i microcontroller possono diventare più potenti, più efficienti e capaci. Le periferiche di logica e flessibilità sono strumenti particolarmente potenti per gestire attività semplici come il debouncing o la decodifica in quadratura. L’uso creativo delle periferiche hardware migliora il design e spinge i confini di ciò che è possibile su un microcontroller.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Menu