Filtri VHDL Overview
Vorrei descrivere, nel corso di qualche pagina, un approccio ai filtri con un occhio rivolto ai progettisti digitali, in modo particolare vorrei riflettere sulle evidenti equivalenze e differenze fra il modo elettronico analogico e quello digitale.
Non voglio fare una trattazione dei filtri digitali, anche se ne parlerrmo e faremo una serie di esempi, perche’ sono descritti molto meglio di quanto potrei fare io su molti libri di elettronica.
Mi interessa di piu’ descrivere quei filtri necessari per risolvere uno specifico problema e dimostrare come le tecniche digitali possono essere di notevole aiuto, specie considerando che le frequenze raggiungibili oggi sono molto alte rendendo il mondo del discreto piu’ vicino a quello del continuo.
Premessa sui filtri VHDL
Tutto quanto andremo a discutere e’ rivolto alla progettazione digitale che ormai pone al suo apice i componenti programmabili e con loro il linguaggio VHDL. Ora, noi abbiamo i costrutti fondamentali di questo linguaggio ed abbiamo anche un common under standing su come affrontare i temi proposti. Tutto cio’ e’ rivolto a intravedere, discutere, provare e giudicare i temi proposti.
Pur cercando di evitare una trattazione matematica e’ comunque necessario avere in testa un po’ di elettronica e di confidenza con le tecniche di analisi di un circuito.
Discussione sui metodi di “gestire” il rumore
Iniziamo da una definizione generale di rumore:
- un qualunque segnale estraneo a quello che noi stiamo considerando che si metta in una qualche relazione con il segnale stesso viene considerato rumore.
Possono essere scritti libri, oltre quelli gia’ scritti, sulle tematiche relative al fenomeno rumore, ma a noi interessa sapere che e’ un segnale elettrico che in qualche modo inter-agisce con il nostro segnale.
Bene, gli elettronici di stampo analogico ben conoscono questo fenomeno, lo hanno classificato e sono anche riusciti a gestirlo, confinarlo, in una parola conviverci.
In genere ci si sforza di eliminarlo (tranne rari casi dove risulta di aiuto) perlomeno nel periodo di osservazione (i piu’ tecnici direbbero nella banda desiderata).
Allo scopo di eliminarlo si inseriscono dei filtri tipicamente passa-basso o passa-banda (in alcuni casi di tipo elimina-banda) che presentano una risposta alla frequenza tale da eliminare il disturbo senza alterare “troppo” il nostro segnale. Come tutti sanno il tipo di filtro piu’ semplice si compone di una cella RC che produce un abbattimento in banda da 20db/dec (cioe’ il segnale viene attenuato di un fattore 10 alla frequenza 10 volte maggiore di quella detta di taglio del filtro espressa in relazione ai valori di R e di C).
Ancora poco e passiamo a discutere fra digitali.
Il rumore per i digitali
Il mondo dei progettisti digitali non conosce il rumore finche’ questo non apporta dei cambiamenti di stato al segnale di interesse, i digitali sono poco interessati, in genere, al rapporto fra segnale e rumore, in una parola finche’ il rumore non e’ come il segnale non interessa.
Questo se ci limitiamo al rumore che compete con il livello logico (sia 1 che 0), ma se una grandezza viene convertita da analogico in digitale (e quindi e’ descritta da una serie di bit) la nostra visione del mondo deve necessariamente cambiare.
Ora un piccolo rumore altera il codice ricavato dalla conversione del segnale e se noi dobbiamo fare una qualche elaborazione su detto codice i risultati possono essere imprevisti.
Un esempio eclatante e’ la comparazione fra due segnali. In elettronica analogica si impiega un componente che amplifica la differenza fra i livelli di tensione dei due segnali fino alla “saturazione” del componente. In pratica il segnale sara’ “alto” se V+>V- e basso viceversa, in realtà e’ necessario specificare che V+ deve essere maggiore di V- piu’ “la soglia di comparazione” cioè i due segnali devono differire fra loro di un epsilon significativo.
I digitale si fa la stessa cosa facendo la differenza fra i due segnali convertiti e ricavando l’informazione true se V+>V- e viceversa, anche in questo caso ci sara’ una soglia di comparazione (l’epsilon di cui sopra)
Cosa accade se su uno dei due segnali si somma un rumore:
-
- se questo rumore e’ tale da superare la soglia di comparazione , il comparatore analogico scatta producendo un glitch
- il comparatore digitale scatta producendo anch’esso un glitch
Come detto prima un analogico metterebbe un filtro che attenuera’ il segnale quel tanto che basta ad evitare il glitch, da notare che alcuni progetti (o particolarmente difficili o mal progettati) prevedono filtri anche dopo il comparatore, cio’ non e’ “bello” perche’ all’uscita del comparatore il segnale viene rigenerato dall’alto guadagno e quindi e’ piu’ difficile il suo contenimento.
Cosa fanno i digitali:
Ovviamente non si puo’ mettere un condensatore (in alcuni casi lo si fa’ anche, ma non e’ bello), il problema deve essere risolto con con i mezzi dell’elettronica digitale dove gli elementi reattivi non sono contemplati.
L’approccio piu’ immediato e’ quello di filtrare nel tempo il segnale, cioe’ il risultato della comparazione sara’ “vero” solo se “dura” un certo tempo (un certo numero di passi di clock), cioe’ si cerca la riconferma del segnale nei passi di clock successivi, se la transizione e’ confermata allora i due segnali sono veramente diversi (la condizione e’ che il rumore non occupi completamente il segnale ma sia confinato in una porzione temporale dello stesso, cioe’ sia fuori banda).
Siamo al nostro VHDL
La soluzione e’ ora semplice, il segnale comparazione deve essere stabile per un certo numero di passi di clock, per esempio posso inserire il segnale in uno shift e pretendere di trovare una serie di bit consecutivi allo stesso valore (and).
A titolo di esempio (ma esistono almeno altri 10 modi):
if(res = '0') then shift<=b”0000”; elsif(clock'EVENT AND clock = '1') then shift(0)<=data_in; shift(3 downto 1)<=shift(2 downto 0); if(shift = b”1111”) then comp<=’1’; elsif(shift = b”0000”) then comp<=’0’; else comp<=comp; end if; end if;
Dal punto di vista circuitale abbiamo realizzato un filtro di tipo passa basso con un ritardo pari a 4 passi di clock e quindi con una banda passante ristretta rispetto alla possibile dinamicita’ del segnale che sarebbe pari al periodo di clock. A differenza di un filtro analogico non si tocca l’ampiezza, ma questo e’ nella definizione di digitale.
Giusto una piccola digressione
Come si sa’ i filtri passa-basso sono anche detti integratori (dalla natura analitica della soluzione del filtro).
Esistono anche filtri derivatori?
Si, cosa significa derivare, significa “esaltare” i cambiamenti, bene i digitali fanno cosi’:
- si sa che la funzione xor da come risultato un “1” quando i due segnali sono diversi e uno “0” quando uguali (un meraviglioso derivatore).
Bene, pero’ in molti casi ci e’ richiesto solo un derivatore sul fronte di salita o di discesa.
In analogico si realizzerebbe una cella CR e quindi si “taglierebbe” (clipping) l’impulso che non serve (tanti anni fa’ anche qualche digitale faceva cosi).
Oggi si farebbe cosi:
if(res = '0') then d1<=’0’; d2<=’0’; d_derivato_up<=’0’; d_derivato_down<=’0’; d_derivato_up_down<=’0’; elsif(clock'EVENT AND clock = '1') then d1<=data_in; d2<=d1; d_derivato_up<=d1 and not(d2); d_derivato_down<=not(d1) and d2; d_derivato_up_down<=d1 xor d2; end if;
Ovviamente la “larghezza” degli impusi derivati puo’ essere aumentata a piacere (es. 16 passi):
if(res = '0') then d1<=’0’; d2<=’0’; d_derivato_up<=’0’; d_derivato_up_allungato<=’0’; d_derivato_down<=’0’; d_derivato_up_down<=’0’; lunghezza del derivatore<=”0000”; elsif(clock'EVENT AND clock = '1') then d1<=data_in; d2<=d1; d_derivato_up<=d1 and not(d2); d_derivato_down<=not(d1) and d2; d_derivato_up_down<=d1 xor d2; if(d_derivato_up = ‘1’) then lunghezza del derivatore<=b”1111” elsif(lunghezza del derivatore = “0000”) then lunghezza del derivatore<= lunghezza del derivatore; elsif(lunghezza del derivatore /= “0000”) lunghezza del derivatore<= lunghezza del derivatore-1; else lunghezza del derivatore<= lunghezza del derivatore-1; end if;
Molti circuiti di comparazione prevedono l’isteresi (anzi io direi che e’ un must), cioe’ il segnale “traversa” soglia A mentre “sale” e dovra’ traversare quella B quando “scende”, cio’ impedisce variazione indesiderate dell’uscita del comparatore proprio mentre si e’ nelle vicinanze della soglia di scatto. Dal punto di vista circuitale il segnale di uscita del comparatore viene usato per condizionare la soglia di ingresso (Trigger di Schmit).
In digitale e’ addirittura banale in quanto dovremo cambiare l’equazione:
if(res = '0') then out<=’0’; elsif(clock'EVENT AND clock = '1') then if(out = ‘0’) then if(data_in > soglia_A) out<=’1’; else out<=’0’; end if; else if(data_in < soglia_B) out<=’0’; else out<=’1’; end if; end if;
Ma e’ possibile filtrare anche in funzione dell’ampiezza del segnale (valore espresso in una stringa di bit)?
In generale la risposta e’ no, anche se molto spesso le condizioni al contorno ci permettono di conoscere in anticipo l’ampiezza del segnale che verra’ applicato, per esempio:
- se si sta leggendo il valore di una temperatura e’ abbastanza difficile che questa vari bruscamente da una rilevamento all’altro, sotto queste condizioni e’ possibile verificare che il valore acquisito sia in un range definibile e quindi scartare un valore troppo diverso (decimazione per errore di lettura)
Sotto queste condizioni e’ possibile effettuare dei filtri il cui risultato, come avremo modi di vedere successivamente, puo’ essere straordinario e in pratica infattibile con tecniche diverse data la complessita’ circuitale che ne seguirebbe.
Leggi di più: VHDL
Repost: 4 marzo 2009