unian logo

Università degli Studi di Ancona

Digital Audio Effect
Delay & Echo
Flanging
Chorusing
Phasing
Reverberation
Compression
Expansion

Hardware
Texas logo
Crystal logo

eealab

Hardware

Gli effetti audio in real time sono stati implementati sul processore per DSP TMS320C31 (TEXAS INSTRUMENTS). Per ciò che riguarda la parte di acquisizione e restituzione del segnale, sono stati utilizzati:

starter kit

Il 'C3x DSK è una scheda che consente lo sviluppo di stand-alone application.

Il DSK ha a bordo un TMS320C31 floating point DSP, che può essere connesso con un host PC attraverso una interfaccia parallela. Questo consente di sviluppare il software su PC, scaricarlo sul DSK su cui il software stesso viene eseguito.

L'acquisizione del segnale analogico è consentita dall'interfaccia single-channel TLC32040, costituita da:

  • convertitore A/D-D/A con un range dinamico di 14 bit in complemento a 2, a 19200 campioni al secondo;
  • output reconstruction filter;
  • bypassable, switched-capacitor, antialiasing input filter;
  • selectable auxiliary analog input channel.

L'input e l'output analogici sono collegati a connettori RCA e sono line-level compatibili. L'output, in particolare, può essere connesso direttamente ad uno speaker. Tuttavia, non avendo un livello significativo, è preferibile l'uso di un amplificatore esterno.

La figura seguente mostra il diagramma a blocchi del TMS320C3x DSK hardware.

DSK Block Diagram

L'AIC è collegato al TMS320C31 attraverso la porta seriale. Un blocco di jumper consente di rimuovere questa connessione in modo da indirizzare la porta seriale ad una DSK-daughtercard.

TMS to AIC interface

Il TMS320C3x resetta l'AIC attraverso il pin esterno XF0. Esso genera inoltre il master clock per l'AIC tramite il pin TCLK0 (output del timer 0). A sua volta l'AIC genera i segnali CLKR0 e CLKX0, nonché FSR0 e FSX0 che costituiscono, rispettivamente, i clock di bit e di frame per le sezioni di ricezione e trasmissione della seriale.

L'uso dell'interfaccia analogica TLC32040 richiede l'inizializzazione ed il set-up della porta seriale, del timer, del convertitore e l'abilitazione delle neccessarie linee di interrupt.

'C31 TIMERS

I due timer del 'C31 sono contatori di eventi general purpose a 32 bit.

Timer Block Diagram

Essi possono essere utilizzati nelle due modalità clock mode o pulse mode e prevedono l'utilizzo di un clock interno o esterno. Con un clock interno i timer possono essere usati per segnalare ad un convertitore esterno di iniziare la conversione, mentre con un clock esterno i timer possono interrompere la CPU dopo un numero fissato di eventi esterni.

I timer hanno un I/O pin che può essere utilizzato come input clock signal, come output clock signal oppure come general purpose I/O pin.

L'inizializzazione ed il set-up dei timer vengono fatti per mezzo di tre registri mappati in memoria:
  • Global Control Register: determina la modalità operativa, controlla lo stato del timer e la funzione del pin di I/O;
  • Period Register: specifica la frequenza del timer;
  • Counter Register: contiene il valore corrente del contatore. Ogni volta che il suo valore diventa uguale a quello del Period Register, viene azzerato e alza la linea di interrupt TINT0.

Memory Mapped Timer Locations

'C31 SERIAL PORT

Il 'C31 è dotato di una porta seriale costituita da una sezione di ricezione e una di trasmissione che consentono l'uso full-duplex della seriale stessa.

Ogni sezione comunica con l'esterno attraverso 3 pin:
  • CLKR/X: clock di bit;
  • FSR/X: segnale di sincronismo di frame;
  • DR/X: linea dati.

Il clock di bit della seriale, per ogni sezione, può essere originato internamente dal serial port timer (TimerR, TimerX), o esternamente da un clock supplementare. In particolare, nel primo caso, il serial port timer è gestito attraverso registri analoghi a quelli del 'C31 timer.

La funzione dei pin della porta seriale è gestita attraverso 8 registri mappati in memoria:

  • Global Control Register: registro a 32 bit che determina la modalità operativa e controlla la funzione globale della porta seriale;
  • FSR/DR/CLKR Port Control Register: registro a 32 bit che controlla la funzione dei pin della sezione di ricezione;
  • FSX/DX/CLKX Port Control Register: registro a 32 bit che controlla la funzione dei pin della sezione di trasmissione;
  • Receive/Transmit Timer Registers:
  • Data Receive Register (DRR): quando il dato seriale è in ingresso, i bit vengono shiftati nel Receive Shift Register (RSR) fino a che non viene contato un numero di bit pari alla lunghezza specificata per la parola. Tale lunghezza è fissata dai bit RLEN (bit 20-21 del Global Control Register). A questo punto il DRR è caricato con il contenuto del RSR e il bit di stato RRDY (bit 0 del Global Control Register) viene settato. Ciò indica che un nuovo dato è pronto per essere letto e sul fronte di salita viene alzata la linea di interrupt RINT.
    Il ricevitore è double-buffered: se il DRR non è stato letto, i dati continuano comunque ad essere shiftati nel RSR fino a che questo registro non è pieno. In questo caso, segnalato da un livello alto del bit RSRFULL (bit 4 del Global Control Register), la sezione di ricezione viene congelata e i successivi bit vengono ignorati; una lettura del DRR è necessaria per consentire la ricezione di nuovi dati.
    Il dato viene shiftato a sinistra (LSB to MSB) e la figura seguente illustra cosa accade quando word di lunghezza minore di 32 bit vengono shiftate nel RSR.

    Quando il DRR viene letto, entrambi i byte a e b sono contenuti in tale registro.
  • Data Transmit Register (DXR): quando il dato deve essere inviato sulla seriale, il registro DXR viene caricato con tale valore. Il trasmettitore carica la word nel Transmit Shift Register (XSR), il bit XRDY (bit 1 del Global Control Register) viene settato specificando che il buffer è pronto per ricevere il dato successivo. Sul fronte di salita di questo segnale viene alzata la linea di interrupt XINT. Il dato non viene caricato nel XSR fino a quando lo shifter non è vuoto. Il ritardo tra la scrittura sul DXR e l'inizio della trasmissione del dato sulla seriale è di due cicli di clock (CLKX).
    Lo shift register è dotato di 4 tap point per la trasmissione del dato: questi punti corrispondono alle quattro data word sizes (8, 16, 24, 32 bit) che possono essere definite mediante i bit XLEN (bit 18-19 del Global Control Register).

    Lo shift avviene verso sinistra (LSB to MSB), e il dato è inviato sulla seriale a partire dal MSB corrispondente all'appropriato tap point.

Per quanto riguarda la temporizzazione della porta seriale, questa è determinata, per ogni sezione, da due segnali di sincronismo: un clock di bit (CLKR/X) e uno di frame (FSR/X).

Il dato è trasmesso sul fronte di salita della linea CLKX, mentre è caricato in RSR sul fronte di discesa di CLKR, benché sia possibile via software cambiare la polarità di tutti i segnali della porta seriale (bit 12÷17 del Global Control Register).

I segnali di sincronismo di frame (FSR/X), che determinano l'inizio della trasmissione e ricezione del dato, hanno una relazione di fase, con i segnali di clock e dati, diversa in base alla modalità di utilizzo della seriale.

Quando FSX è specificato come output, l'attività del segnale è determinata esclusivamente dallo stato interno della porta seriale. In fixed data rate mode, FSX viene alzato quando DXR è caricato in XSR per essere trasmesso. Dopo un ciclo di clock FSX torna inattivo e inizia la trasmissione del dato. In variable data rate mode, FSX viene attivato nel momento in cui inizia la trasmissione del dato e rimane attivo durante l'intera trasmissione. Anche in questo caso intercorre un ciclo di clock tra il caricamento del registro e l'inizio della trasmissione.

Quando FSX è specificato come input, in fixed data rate mode la linea deve essere tenuta attiva per almeno un ciclo di clock e quindi abbassata per dare inizio al trasferimento. A questo punto il trasmettitore invia il numero di bit specificato dai bit XLEN. In variable data rate mode, la trasmissione ha inizio dal momento in cui FSX diventa attivo fino a quando il numero di bit specificato non è shiftato fuori. Se lo stato di FSX cambia prima che l'ultimo bit sia stato trasmesso, la trasmissione viene comunque completata.

Il segnale FSR è sempre un input per la seriale e si comporta in modo analogo al FSX.

Utilizzando un FSX esterno, se DXR e XSR sono vuoti, una scrittura su DXR causa un trasferimento da DXR a XSR in cui il dato resta fino al successivo segnale di sincronismo FSX. Una nuova scrittura su DXR, prima del segnale FSX, fa variare il contenuto di tale registro senza causare alcun trasferimento da DXR a XSR.

TLC32040 AIC

L'interfaccia analogica TLC32040 è pilotata da un master clock (MCLK) che deve avere una frequenza compresa tra 75 KHz e 10 MHz.

La frequenza di campionamento dell'AIC è determinata dai valori dei registri A e B delle sezioni di ricezione e trasmissione in base alla relazione:

I valori di MCLK e di A determinano, oltre alla frequenza di conversione, anche le frequenze di taglio degli switched-capacitor filter. Tali filtri, lowpass in ingresso e bandpass in uscita, hanno caratteristiche che si adattano alla banda telefonica (300 ÷ 3600 Hz) se la frequenza di clock in ingresso agli switched-capacitor filter è pari a 288 KHz. Tale frequenza è espressa dalla relazione:

Se il valore precedente è diverso dai 288 KHz, le frequenze di taglio dei filtri vengono variate di conseguenza.

Per inizializzare i registri A e B sono necessarie due comunicazioni: una primaria e una secondaria. La comunicazione primaria è costituita da una word di 16 bit.

I 14 MSB rappresentano il data value; i 2 LSB sono bit di modo che vengono interpretati in base alla tabella seguente:

La comunicazione secondaria segue immediatamente una comunicazione primaria con bit di modo 11. Questa comunicazione programma l'AIC mediante il caricamento dei registri A, A', B o di controllo.

Il registro di controllo consente di abilitare e disabilitare eventuali ingressi ausiliari e il bandpass filter, di impostare il guadagno in ingresso, la modalità di trasmissione/ricezione e la funzione di loopback.

'C31 INTERRUPTS

Il TMS320C31 supporta più linee di interrupt sia interni che esterni.

Quattro registri della CPU contengono bit utilizzati per il controllo degli interrupt:

  • Status Register (ST): il Global Interrupt Enable Bit (GIE) controlla tutti gli interrupt mascherabili della CPU. Quando GIE=1 la CPU risponde a tutti gli interrupt abilitati. Se, invece, GIE=0, tutti gli interrupt sono disabilitati;
  • CPU/DMA Interrupt Enable Register (IE): questo registro abilita o disabilita individualmente gli interrupt del DMA e della CPU;
  • CPU Interrupt Flag Register (IF): questo registro contiene i flag che indicano l'attivazione della corrispondente linea di interrupt;
  • DMA Global Control Register: controlla gli interrupt del DMA.

Gli interrupt sono vettorizzati: ad ogni flag corrisponde una locazione di memoria nella quale è indicato l'indirizzo della corrispondente routine di servizio (microcomputer mode), ovvero una istruzione di salto all'inizio della routine stessa (microprocessor mode).

INIZIALIZZAZIONE E SET-UP

I seguenti segmenti di codice sono quelli utilizzati per la configurazione e l'inizializzazione dello Starter Kit:

      

ldi   0,R0            ; Halt TIM0
sti   R0,@T0_ctrl     ;
sti   R0,@T0_count    ; Set counts to 0
ldi   3,R0            ; Set periods to 3
sti   R0,@T0_prd      ;
ldi   0x2C1,R0        ; Restart timer
sti   R0,@T0_ctrl     ;
il timer viene disabilitato (T0_ctrl=0) prima di settare i relativi registri di configurazione. Il contatore viene azzerato ed il periodo è posto pari a 3; quindi il timer viene riabilitato (T0_ctrl=0x2C1) utilizzando un clock interno (12.5 MHz). L'uscita del timer, pin TCLK0, è impulsiva ed ha una frequenza:
f=f(timer clock)/T0_prd=4.167 MHz.
; AIC registers values
TA             .set       3
TB             .set       36
RA             .set       3
RB             .set       36
C_REG          .word  00000011b
il MCLK del convertitore è collegato al pin TCLK0 che fornisce un segnale compatibile con le specifiche dell'AIC. I valori dei registri A e B sono tali da settare la frequenza di conversione a 19.3 KHz (massima frequenza accettabile dal convertitore). Il registro di controllo (C_REG) è settato in modo tale che la dinamica sia pari a ±6 V, i convertitori AD e DA possano lavorare in modo asincrono e siano esclusi l'ingresso ausiliario, la funzione di loopback e il filtro passa-banda. In particolare, il filtro passa-banda è escluso poiché il valore dei registri porta ad avere una frequenza di taglio inferiore di circa 1 KHz, inaccettabile per applicazioni audio.
; Serial port control register values
S0_gctrl_val   .word  0x0E970300
S0_xctrl_val   .word  0x00000111
S0_rctrl_val   .word  0x00000111
i clock di bit (CLKX/R) provengono dall'esterno, in particolare dall'AIC. La modalità di trasmissione è variable-burst, con word a 16 bit (lunghezza di parola del convertitore). Le polarità di tutti i segnali sono positive e vengono abilitati solo XINT e RINT. I registri S0_xctrl_val e S0_rctrl_val impostano i 6 pin come pin seriali piuttosto che come general-purpose.
; GIE bit in ST turns on interrupts
GIE            .set       0x2000 
main
or    GIE,ST          ; Turn on INTS
ldi   0xF4,IE         ; Enable XINT/RINT/INT2
b     main            ; Do it again!
;****************************************************;
; Install the XINT/RINT ISR handler directly into    ;
; the vector RAM location it will be used for        ;
;****************************************************;
.start   "SP0VECTS",0x809FC5
.sect    "SP0VECTS"
B        DAC2         ; XINT0
B        ADC2         ; RINT0
tutti i programmi sono interamente interrupt-driven: l'unica attività della CPU è quella di attendere e quindi servire gli interrupt. Nel caso specifico, gli unici interrupt abilitati (GIE=1 e IE=0xF4) sono quelli relativi alle sezioni di ricezione e trasmissione della seriale e quello della porta parallela, necessario alla comunicazione con il PC-host. Un livello alto sulle linee XINT/RINT causa l'esecuzione delle istruzioni di salto caricate nel vettore degli interrupt: tali istruzioni rimandano alle routine ADC2/DAC2, che eseguono, rispettivamente, l'acquisizione del campione e il calcolo e la restituzione dell'output del filtro.

Top

Next

About

Digital Audio Effects