Sunteți pe pagina 1din 90

Universitatea “Politehnica” din Bucureşti

Facultatea de Electronică, Telecomunicaţii şi Tehnologia Informaţiei

Flux audio digital transmis prin laser în mediu aer implementat cu


FPGA

Lucrare de dizertaţie
prezentată ca cerinţă parţială pentru obţinerea titlului de
Master în domeniul Inginerie Electronică și Telecomunicații
programul de studii de masterat Optoelectronică

Conducător ştiinţific Absolvent


Prof. Dr. Ing. Paul Șchiopu Ing. Andrei Ghinea

2012
Copyright © 2012 , Ghinea D. Andrei

Toate drepturile rezervate

Autorul acordă UPB dreptul de a reproduce şi de a distribui public copii pe hârtie sau
electronice ale acestei lucrări, în formă integrală sau parţială.
Cuprins

Introducere ....................................................................................................................................... 17
1. Fundamente teoretice .................................................................................................................. 19
1.1 Semnale digitale ....................................................................................................................... 19
1.2 Coduri unipolare și bipolare ..................................................................................................... 19
1.3 FPGA(Field Programmable Gate Array) ................................................................................. 20
1.4 Laserul cu semiconductori........................................................................................................ 21
1.5 Fotodioda .................................................................................................................................. 22
2. Proiectare ...................................................................................................................................... 25
2.1 Specificații ................................................................................................................................ 25
2.2 Schema de principiu ................................................................................................................ 25
2.3 Implementarea sistemului digital de trasmisie - recepție ......................................................... 26
2.3.1 Prezentarea teoretică a procesului digital de citire - scriere .............................................. 26
2.3.2 Recepția semnalelor analogic și digital. Implementarea achiziției prin ADC .................. 30
2.3.2.1 Procesul de citire al ADC ........................................................................................ 30
2.3.2.2 Implementarea digitală a citirii ADC ...................................................................... 32
2.3.3 Transmisia semnalelor analogic și digital. Implementarea expedierii pe DAC ............... 33
2.3.3.1 Procesul de scriere al DAC ...................................................................................... 33
2.3.3.2 Implementarea digitală a scrierii DAC .................................................................... 34
2.3.4 Implementarea digitală a procesului de citire - scriere ...................................................... 35
2.3.5 O privire de ansamblu asupra circuitului digital. Modulul de top ..................................... 40
2.4 Proiectarea sistemului optic de transmisie - recepție ............................................................... 41
2.4.1 Sistemul de transmisie ....................................................................................................... 41
2.4.1.1 Driver-ul laser ........................................................................................................... 41
2.4.2 Sistemul de recepție ........................................................................................................... 47
2.4.2.1 Receptorul optic ........................................................................................................ 49
2.5 Schema finală a sistemului optic de transmisie - recepție ........................................................ 51
3. Implementare și testare ............................................................................................................... 53
3.1 Sinteza circuitului digital.......................................................................................................... 53
3.1.1 Sumarul raportului de sinteză ........................................................................................... 53
3.1.2 Asignarea pinilor .............................................................................................................. 53
3.1.3 Verificarea și testarea circuitului digital ........................................................................... 54
3.2 Realizarea driver-ului laser ..................................................................................................... 55
3.3 Testarea driver-ului laser ......................................................................................................... 57
3.4 Realizarea și testarea receptorului cu fotodiodă ...................................................................... 58
3.5 Realizarea sistemului final ...................................................................................................... 59
3.6 Testarea sistemului final .......................................................................................................... 61
Concluzii ........................................................................................................................................... 65
Bibliografie ....................................................................................................................................... 67
Anexa 1 - Sumarul raportului de sinteză ..................................................................................... 69
Anexa 2 - Asignarea pinilor în FPGA .......................................................................................... 70
Anexa 3 - Codul sursă Verilog ...................................................................................................... 71
Lista figurilor

Figura 1.1 - Structura diodei laser ..................................................................................................... 22


Figura 1.2 - Structura constructivă a fotodiodei ................................................................................ 23
Figura 2.1 - Schema de principiu a sistemului de transmisie - recepție ............................................ 26
Figura 2.2 - Transmisia și recepția sincronizată a unui bit prin sistem ............................................ 27
Figura 2.3 - Blocul digital de citire ADC ........................................................................................... 32
Figura 2.4 - Ciclul de citire al unui eșantion din ADC ...................................................................... 33
Figura 2.5 - Blocul digital de scriere DAC ........................................................................................ 34
Figura 2.6 - Ciclul de scriere al unui eșantion în DAC ..................................................................... 35
Figura 2.7 - Blocul digital al procesului ............................................................................................ 39
Figura 2.8 - Trecerea automatului între stări și selecția canalelor ADC și DAC ............................. 40
Figura 2.9 - Structura modulului de top............................................................................................. 40
Figura 2.10 - Schema driver-ului laser .............................................................................................. 42
Figura 2.11 - Driver-ul laser cu intrare dinspre DAC în gol............................................................. 43
Figura 2.12 - Driver-ul laser cu ieșire DAC 0V ................................................................................. 44
Figura 2.13 - Driver-ul laser cu ieșire DAC 3V ................................................................................. 45
Figura 2.14 - Circuitul de protecție la supracurent ........................................................................... 46
Figura 2.15 - Schema de măsură a comportamentului circuitului în cazul aplicării unui semnal
dreptunghiular de frecvență 150KHz și amplitudine 3Vpp ............................................................... 47
Figura 2.16 - Simularea comportamentului circuitului la aplicarea unui semnal cu amplitudinea
Vpp 3V și frecvența 150KHz .............................................................................................................. 48
Figura 2.17 - Schema receptorului..................................................................................................... 49
Figura 2.18 - Schema receptorului rezultată prin modelarea fotodiodei .......................................... 49
Figura 2.19 - Schema de măsură în cazul aplicării unei intensități optice pe fotodioda simulată cu
surse de curent ................................................................................................................................... 50
Figura 2.20 - Simularea receptorului în cazul aplicării unui semnal optic cu intensitate variabilă
dreptunghiular ................................................................................................................................... 51
Figura 2.21 - Schema finală a sistemului de transmisie - recepție .................................................... 52
Figura 3.1 - Schema driver-ului laser prezentă pe placa de test ....................................................... 56
Figura 3.2 - Schema receptorului cu fotodiodă.................................................................................. 59
Figura 3.3 - Adăugarea componentei continue peste semnalul audio recepționat ............................ 60
Figura 3.4 - Schema finală a circuitului cu toate componentele interconectate................................ 61
Figura 3.5 - Semnal sinusoidal de frecvență 50Hz............................................................................. 62
Figura 3.6 - Semnal triunghiular de frecvență 200Hz ....................................................................... 62
Figura 3.7 - Semnal dreptunghiular de frecvență 500Hz ................................................................... 62
Figura 3.8 - Semnal sinusoidal de frecvență 500 Hz și amplitudine mică ......................................... 62
Figura 3.9 - Lupă semnal sinusoidal 20Hz. Treptele de tensiune la ieșirea DAC-ului sunt vizibile . 63
Figura 3.10 - Semnal sinusoidal 2KHz .............................................................................................. 63
Figura 3.11 - Comportamentul sistemului la frecvență apropiată de frecvența maximă .................. 63
Figura 3.12 - Comportamentul sistemului la frecvență peste frecvența maximă ............................... 64
Lista tabelelor

Tabelul 2.1 - Ciclul complet de citire - scriere și transmisie digitală a unui eșantion audio ........... 28
Tabelul 2.2 - Timpii minimi de lucru ai componentelor sistemului ................................................... 28
Tabelul 2.3 - Variante de reducere a timpului în care un eșantion digital ajunge de la DAC la ADC
............................................................................................................................................................ 29
Tabelul 2.4 - Timpii de lucru ai componentelor sistemului ............................................................... 30
Tabelul 2.5 - Timpii alocați fiecărei stări a procesului ..................................................................... 30
Tabelul 2.6 - Selecția canalului următor în funcție de starea procesului de citire ........................... 31
Tabelul 2.7 - Stările procesului de citire a informației pe ADC ........................................................ 31
Tabelul 2.8 - Datele de intrare și de ieșire din procesul de citire ADC ............................................ 33
Tabelul 2.9 - Datele de intrare și de ieșire din procesul de scriere DAC ......................................... 35
Tabelul 2.10 - Stările automatului de citire - scriere ........................................................................ 36
Tabelul 2.11 - Simularea expedierii unui eșantion prin procesul de citire - scriere ......................... 38
Tabelul 2.12 - Datele de intrare și de ieșire din modulul procesului de citire - scriere ................... 39
Tabelul 2.13 - Curenții prin dioda laser în cazurile de operare posibile ale driver-ului laser......... 46
Lista acronimelor
ADC – convertor analog digital
BLC – bloc logic configurabil
CLK – semnal de ceas
CD – compact disc
CH – canal (channel)
DAC – convertor digital - analog
FD – fotodiodă
FPGA – field programmable gate array – matrice de porți logice programabile
GND – ground – punct de masă
HDL – hardware descriptive language - limbaj de descriere hardware
IDE – integrated development environment – mediu integrat de dezvoltare
LSB – least significant bit – cel mai puțin semnificativ bit
LUT – look-up table – tabelă de căutare
LED – light emmiting diode – diodă emițătoare de lumină
MSB – most significant bit – cel mai semnificativ bit
PCB – printed circuit board - cablaj imprimat
P-S – paralel - serial
PSF – punct static de funcționare
S-P – serial - paralel
SMD – surface mounted device - dispozitiv montat pe suprafață
Introducere

Transmisia informației a reprezentat una dintre cele mai mari provocări ale omenirii încă
din cele mai vechi timpuri. Dacă până acum aproximativ un secol transmisia informației se
realiza cu dificultate, cantitatea datelor transmise era, de cele mai multe ori, mică și eforturile
pentru realizarea transmisiei erau semnificative, astăzi transmisia informației nu mai reprezintă
un impediment. Cercetările au condus la descoperirea de noi metode mai rapide și mai puțin
costisitoare pentru a realiza transmisia informațiilor la distanță. Transmisia optică a informației
este una dintre cele mai rapide metode de expediere a datelor, viteza cu care acestea sunt
transmise depășește multe standarde, considerate aproape imbatabile acum câțiva zeci de ani. Un
dezavantaj al transmisiei optice este reprezentat de costul ridicat al echipamentelor de rețea cu
ajutorul cărora datele sunt transmise între două locații. Costul echipamentelor folosite la
implementarea rețelelor optice crește direct proporțional cu viteza și cantitatea de informație
expediată în unitatea de timp.
În prezenta lucrare îmi propun să demonstrez că se poate realiza o transmisie digitală
eficientă utilizând o lanternă laser obișnuită, achiziționată din comerț, o fotodiodă și un număr
redus de componenete electronice discrete. Transmisia este digitală, laserul este modulat în
intensitate, modularea este realizată prin intermediul unui driver implementat cu tranzistoare
bipolare. Recepția este realizată simplu cu ajutorul unei fotodiode. Un plus al acestei lucrări este
adus de modul de lucru al fotodiodei, aceasta lucrează în regim fotovoltaic pe o sarcină rezistivă,
mod considerat de cele mai multe ori inadecvat pentru recepția de date, deși, în practică, este
preferat regimul fotoconductiv. Mediul de transmisie este accesibil și anume mediul aer. Pentru a
demonstra funcționalitatea acestui sistem de transmisie a informației am ales să expediez un
semnal audio care este convertit din semnal analogic în semnal digital. Semnalul rezultat este
expediat bit cu bit prin intermediul laserului, recepția se realizează prin intermediul unei
fotodiode, semnalul digital este reconstituit și apoi convertit în semnal analogic. Semnalul
analogic reconstituit este livrat utilizatorului. Viteza de transmisie a acestui sistem este decentă,
având în vedere modul în care este alcătuit. Viteza de transmisie a informației este de 150Kbiți/s,
aceasta poate fi crescută până la atingerea limitelor sistemului descrise în lucrarea de față. Am
realizat practic acest sistem alegând distanța de 50cm între laser și fotodiodă. Implementarea
driver-ului laser și a receptorului cu fotodiodă este realizată pe o placă de test și lucrul cu
semnalele digitale prin intermediul unei plăci de dezvoltare FPGA cu ADC și DAC (ambele cu
două canale). De asemenea, nicio componentă a sistemului nu este adusă spre limitele
constructive, fapt ce conduce la operarea în siguranță a sistemului de transmisie și garantează
siguranța utilizatorului. Laserul folosit emite o putere optică de 1-2mW în timpul funcționării,
dar în cazul în care se intervine pe placa de test poate emite pană la 5mW. Această putere este
considerată limita maximă acceptată ce nu pune în pericol vederea utilizatorului în cazul unei
expuneri directe de scurtă durată. Având în vedere acest aspect recomand tuturor celor care vor
folosi lucrarea practică să evite expunerea directă sau să folosească ochelari de protecție.
17 
 
În conținutul lucrării voi parcurge toate etapele de proiectare, implementare digitală și
transpunere în practică a sistemului. De asemenea, o importanță deosebită este acordată
implementării practice și testării sistemului. În capitolul 2 sunt prezentate toate aspectele
teoretice specifice lucrării și simularea sistemului digital, iar în capitolul 3 sunt prezentate toate
aspectele implementării fizice sub forma unui ghid de realizare și testare practică.

18 
 
Capitolul 1
Fundamente teoretice

1.1 Semnale digitale

Un semnal y(t) poate fi numit semnal analogic sau semnal continuu în timp dacă este
definit pentru toate valorile variabilei continue t. Dacă semnalul este definit doar pentru valori
discrete ale variabilei t, atunci el poate fi numit semnal discret în timp sau semnal analogic
eşantionat. Dacă, în plus faţă de a fi discret în timp, valoarea unui semnal poate lua la un
moment arbitrar de timp doar anumite valori într-un domeniu discret şi fiecare din aceste valori
pot fi reprezentate matematic printr-un cod (de exemplu: cel binar), atunci se poate spune că
semnalul respectiv este un semnal digital.
Pentru a transforma un semnal analogic într-un semnal digital se efectuează trei operații:
 preluarea de valori din semnalul analogic la momente discrete de timp(eșantionare);
 cuantizarea valorilor luate în momentele discrete de timp prin alocarea unei valori pentru
fiecare treaptă de amplitudine;
 codarea semnalului printr-un cod asociat fiecărui eșantion.

Circuitul care realizează această operație se numește convertor analog - digital, prescurtat ADC.
Pentru a reface semnalul analogic din semnalul digital trebuie parcurse operațiile
complementare procesului de transformare din semnal analogic în semnal digital. Operațiile
efectuate, în acest caz, se numesc decodare, decuantizare și deeșantionare. Este evident că
semnalul analogic inițial nu poate fi refăcut identic din semnalul digital din cauza pierderii de
informație din momentul eșantionării, dar semnalul obținut aproximează în anumite limite
semnalul inițial. Circuitul care realizează această operație se numește convertor digital - analog,
prescurtat DAC.
În cazul acestei lucrări am folosit ambele operații, atât conversia analog - digitală
(recepția semnalului audio, recepția semnalului de pe fotodiodă) cât și conversia digital - analogă
(livrarea semnalului audio reconstituit, livrarea semnalului către driver-ul laser).

1.2 Coduri unipolare și bipolare

  Codurile unipolare sunt folosite pentru reprezentarea numerelor fără semn. Cel mai
cunoscut cod unipolar este codul binar natural. Acesta asociază valoarea 0 nivelului coborât și
valoarea 1 nivelului ridicat, astfel 00…0 corespunde capătului inferior al nivelului de variație al
mărimii analogice reprezentate, iar 11…1 corespunde capătului superior al aceluiași interval.
Valoarea codificată se poate reconstitui din valoarea binară folosind conversia digital - analogă
reprezentată de formula:

19 
 
2 ,

unde k este poziția bitului în reprezentarea binară (începând cu poziția 0), bk este valoarea bitului
curent, iar y este valoarea analogică reprezentată. Operația de conversie digital - analogă este
realizată de convertoarele digital - analoge (DAC). Operația de conversie analog - digitală este
realizată de convertoarele analog - digitale (ADC). Și DAC-ul și ADC-ul lucrează după formula
descrisă mai sus pentru a realiza operația de conversie.
Codurile bipolare sunt folosite pentru reprezentarea numerelor cu semn. Cele mai
utilizate coduri bipolare pentru realizarea convertoarelor analog-digitale și digital-analogice sunt:
 coduri directe: mărime şi semn (MS), complement faţă de 1 (1C), complement
faţă de 2 (2C), binar deplasat (BD);
 coduri complementare: mărime şi semn complementar, complement faţă de 1
complementar, complement faţă de 2 complementar, binar deplasat
complementar;
 coduri modificate: mărime şi semn modificat, complement faţă de 1 modificat.

Toate codurile bipolare se caracterizează prin folosirea unui bit pentru reprezentarea
semnului situat în poziţia bitului MSB al cuvântului binar, denumit bit de semn. Restul biţilor
sunt folosiți pentru reprezentarea valorii eşantionului şi se numesc biţi de mărime. Prin folosirea
bitului de semn, gama de reprezentare se prelungeşte pe semiaxa numerelor negative, însă îşi
reduce la jumătate numărul de valori reprezentabile pe semiaxa numerelor pozitive.
Codurile complementare se obţin din codurile directe prin complementarea tuturor biţilor.
Codurile modificate se folosesc numai pentru variantele mărime şi semn, respectiv complement
faţă de 1, şi se caracterizează prin faptul că bitul de semn din codul direct corespunzător este
complementat.
În lucrarea de față voi folosi reprezentarea în cod binar natural (binar fără semn).

1.3 FPGA (Field Programmable Gate Array)

Un FPGA (Field Programmable Gate Array) este un circuit integrat digital disponibil sub
formă de circuit integrat configurabil de către utilizator (spre deosebire de dispozitivele a căror
funcție este implementată în procesul de fabricație), care conține o matrice de blocuri logice
configurabile (BLC) și canale de rutare între aceste blocuri logice. Un bloc logic configurabil
disponibil într-un FPGA este alcătuit dintr-un tabel cu patru intrări (numit look-up table sau
prescurtat LUT), un bistabil de tip D și un multiplexor care selectează fie ieșirea din tabelul de
căutare, fie ieșirea sincronizată a acestuia. LUT-ul reprezintă în esență o memorie, care prin
scriere poate implementa diferite funcții logice. Prin interconectarea mai multor BLC-uri se pot
realiza blocuri care implementează funcții mai complicate cum ar fi registrele de shift-are,
memoriile de dimensiuni reduse sau sumatoarele. De asemenea, majoritatea plăcilor FPGA vin

20 
 
cu o parte din blocurile mari consumatoare de timp deja optimizate și implementate (în special
înmulțitoarele și împărțitoarele).
Programarea unui FPGA reprezintă procesul prin care codul scris într-un limbaj HDL
(Hardware Descriptive Language) sau un circuit realizat prin intermediul unei scheme este
transpus în dispozitivul FPGA. Procesul începe cu sinteza codului (compilarea și realizarea
netlist-ului), unde este generată toată logica necesară implementării codului, apoi această logică
este optimizată și redusă la minim. În funcție de opțiunile utilizatorului se pot implementa
design-uri mai rapide dar consumatoare de putere sau design-uri mai lente care balansează
puterea consumată cu timpii necesari propagării impulsurilor electrice. După realizarea design-
ului urmează transpunerea în codul ce va fi scris în FPGA, ținându-se cont de constrângerile
setate de utilizator și de resursele disponibile. În cazul în care design-ul implementat consumă
toate resursele plăcii, acesta nu va putea fi rutat, iar procesul se va încheia cu o eroare. După ce
se trece și de acest pas urmează o testare a timpilor de răspuns și determinarea frecvenței maxime
la care circuitul poate lucra. Dacă aceasta este sub frecvența oscilatorului, folosită ca frecvență
de referință, procesul se va încheia cu o alertă care anunță că circuitul nu lucrează la viteza
maximă de proiectare. După parcurgerea cu succes a tuturor pașilor de mai sus, design-ul poate fi
transferat în FPGA iar utilizatorul poate începe procesul manual de testare prin verificarea
datelor de la ieșire în funcție de stimulii aplicați la intrare. De asemenea, unele soft-uri pun la
dispoziție și un instrument de diagnoză în timp real on chip pentru a oferi utilizatorului un
răspuns clar la problemele care nu pot fi eliminate în urma simulării.

1.4 Laserul cu semiconductori[1]

Laserul cu semiconductori este, astăzi, cel mai cunoscut și utilizat tip de laser în diferite
tipuri de aplicații (aceiași laseri sunt utilizați inclusiv la citirea CD-urilor, la imprimante, pointere
pentru prezentari, etc.). Mediul activ al laserului cu semiconductori este similar unei diode cu
semiconductor și, din acest motiv, laserul cu semiconductor este numit diodă laser. Voi explica
în cele ce urmeaza principiile de funcționare ale unei diode laser fără a intra în detaliile legate de
structura fizică și constructivă.
Diodele laser sunt formate dintr-o joncțiune p-n cu o dopare puternică. Principalele
procese care intervin în emisia laser în astfel de sisteme sunt:
 emisia laser are loc la recombinarea electron - gol de pe nivelurile energetice din banda
de valență și banda de conducție;
 o cuantă absorbită în joncțiune duce la generarea unei perechi electron - gol, crescând
astfel posibilitatea de recombinare.

Ca urmare a acestor procese poate avea loc o emisie stimulată de fotoni. Inversia de
populație necesară pentru realizarea efectului laser se obține prin aplicarea unei tensiuni electrice
directe pe joncțiune astfel încât, prin scăderea barierei de potențial, crește rata de obținere a
perechilor electron - gol prin tranziții între cele doua benzi energetice. Prezența impurităților
contribuie și mai mult la realizarea inversiei de populație. Deoarece în emisia laser, emisia

21 
 
stimulată trebuie să fie principalul proces de emisie și absorbția trebuie să fie neglijabilă,
tensiunea aplicată pe joncțiune trebuie să depășească valoarea de prag dată de relația U > W/e ,
unde W este energia benzii interzise și e este sarcina electrică elementară.
Din punct de vedere tehnologic dioda laser este realizată, de exemplu, din cristale
semiconductoare de GaAs și GaAlAs dopate cu impurități acceptoare de Zn și impurități donoare
de Te așa cum poate fi observat în figura 1.1.

Figura 1.1 - Structura diodei laser

Avantajul pe care îl prezintă laserii cu semiconductori este faptul că sunt foarte compacți
față de celelalte tipuri de laseri. Acest fapt se datorează și unei cavități de rezonanță de
dimensiuni micronice formată de cristalul semiconductor a cărui suprafețe sunt tăiate și polizate
corespunzător radiațiilor laser emise precum și a modului de funcționare al laserului.
Laserii cu semiconductori emit în domeniul infraroșu sau vizibil. Este de remarcat că
lungimea de undă emisă de astfel de sisteme poate fi modificată prin ajustarea temperaturii la
nivelul joncțiunii sau prin introducerea diodei într-un câmp magnetic a cărui intensitate poate fi
modificată. Laserii cu semiconductori pot lucra în regim continuu când se obțin puteri de ordinul
1W sau în regim de impulsuri unde se obțin puteri de ordinul W, chiar și MW.

1.5 Fotodioda[2]

Fotodioda este un dispozitiv optoelectronic cu o joncțiune p-n cu aria activă mică


(milimetri pătrați) și se utilizează în regim polarizat, la tensiuni inverse sau în regim nepolarizat.
Între o fotodiodă și o diodă obișnuită există două deosebiri constructive importante:
 capsula diodelor semiconductoare este opacă, în timp ce pentru fotodiode există o
fereastră transparentă;
22 
 
 la o diodă semiconductoare toată suprafața zonei difuzate este acoperită cu un
strat metalic ce constituie unul dintre electrozi, în timp ce în cazul fotodiodei
această suprafață este acoperită cu un strat reflectant.

Structura fotodiodei este reprezentată în figura 1.2

Figura 1.2 - Structura constructivă a fotodiodei

De obicei fotodiodele nu se utilizează în regim fotovoltaic ci în regim fotoconductiv prin


aplicarea unei tensiuni inverse la borne.

23 
 
24 
 
Capitolul 2
Proiectare

Acest capitol pune accentul pe simularea și proiectarea design-ului propus, fiind descrise
blocurile digitale și analogice componente împreună cu legăturile dintre ele și conceptele ce stau la
baza funcționării sistemului digital de transmisie - recepție. Ordinea în care sunt prezentate
informațiile din acest capitol este strict legată de drumul parcurs de semnalul audio în circuit,
încercând să păstreze coerența între subcapitole. Argumentele aduse sunt însoțite de schemele bloc
și de o scurtă simulare a unui exemplu care face mai ușor de înțeles modul de funcționare al fiecărui
bloc. Toate simulările sunt realizate în ModelSimXEIII/Starter 6.2C pentru partea de circuite
digitale și în NI Multisim 10.1 pentru circuitele analogice.

2.1 Specificații

Având la dispoziție o placă FPGA cu ADC (două intrări) și DAC (două ieșiri), o diodă laser,
o fotodiodă și un număr mic de componente discrete active și pasive, îmi propun să realizez un
sistem de transmisie digital al unui flux audio care să răspundă următoarelor cerințe:
 Citește un semnal audio analogic;
 Convertește semnalul audio în semnal digital;
 Transmite serial semnalul digital bit cu bit prin laser;
 Recepționează eșantioanele transmise;
 Decodează și reconstituie semnalul digital recepționat;
 Convertește semnalul recepționat în semnal audio și îl livrează spre ieșire;
 Frecvența maximă a semnalului audio ~ 8KHz;
 Amplitudinea maximă la intrare 3V Vpp;
 Amplitudinea maximă la ieșire 2.5V Vpp;
 Eșatioanele audio sunt reprezentate pe 8biți fără semn;
 Laserul este modulat în amplitudine cu fmax ~ 150KHz.

2.2 Schema de principiu

Placa de dezvoltare FPGA dispune de un ADC cu două intrări și un DAC cu două ieșiri. Voi
folosi prima intrare a ADC-ului (CH0) pentru a prelua semnalul audio analogic și a-l converti în
semnal digital. Voi folosi a doua intrare a ADC-ului pentru a prelua semnalul recepționat de
fotodiodă. De asemenea, prima ieșire a DAC-ului (VoutA) va servi pentru livrarea semnalului audio
recepționat către utilizator, iar a doua ieșire (VoutB) pentru a livra semnalul digital bit cu bit către
driver-ul laserului. În figura 2.1 este descrisă schema de principiu a întregului sistem de transmisie -
recepție.

25
 

Figura 2.1 - Schema de principiu a sistemului de transmisie - recepție

Sistemul de trasmisie - recepție este alcătuit din două părți esențiale. Prima parte este
reprezentată de placa FPGA împreună cu ADC și DAC care realizează prelucrarea digitală a
semnalului audio și conversiile digital - analogice și analog - digitale. Design-ul propus pentru
această parte este alcătuit din trei module:
 Procesul de citire - scriere va realiza interpretarea semnalelor recepționate, expedierea
semnalelor către laser și utilizator, sincronizarea internă a semnalelor expediate și
recepționate, citirea în paralel a ADC-ului și scrierea în paralel a DAC-ului. Este
important de reținut că ADC-ul și DAC-ul pot executa o singură operație pe un singur
canal o dată, drept urmare un proces destul de complex de sincronizare a citirii/scrierii
canalelor este necesar;
 Recepția semnalelor analogic și digital realizează două funcții, prima funcție fiind
citirea semnalului audio analogic trimis de utilizator, iar a doua funcție fiind recepția
semnalului digital de pe fotodiodă;
 Transmisia semnalelor analogic și digital realizează două funcții, prima funcție fiind
transmiterea semnalului audio recepționat către utilizator, iar a doua funcție fiind
transmiterea semnalului digital către modulatorul (driver-ul) laser.

A doua parte este reprezentată de implementarea driver-ului laser ce va realiza modularea în


amplitudine a acestuia și recepția semnalului pe fotodiodă. Design-ul propus pentru această parte
este alcătuit din două module:
 Driver-ul laser realizează funcția de modulare internă în amplitudine a laserului prin
variația curentului în dioda laser. De asemenea, laserul este operat la un curent minim
peste curentul de prag, ceea ce permite modularea la o frecvență mare;
 Receptorul cu fotodiodă PIN realizează recepția semnalului optic și conversia acestuia în
semnal electric. Modul de funcționare al fotodiodei este în regim fotovoltaic cu
descărcare pe sarcină rezistivă.

2.3 Implementarea sistemului digital de trasmisie - recepție

Sistemul de transmisie - recepție realizează toate operațiile de citire a semnalului audio,


transformarea sa în semnal digital, expedierea eșantioanelor semnalului în sistemul laser -
fotodiodă, recepționarea eșantioanelor expediate și redarea semnalului recepționat.

2.3.1 Prezentarea teoretică a procesului digital de citire - scriere

Procesul digital de citire - scriere realizează intepretarea semnalelor recepționate, expedierea


semnalelor către ADC și DAC și sincronizarea citirii și a scrierii. Din cauză că nu dispun de două
plăci FPGA pentru a realiza trasmiterea la distanță a semnalului optic și implicit realizarea a două
sisteme independente emisie - recepție, a fost necesară implementarea transmisiei și a recepției pe
același FPGA. ADC-ul și DAC-ul dispun fiecare de două canale, dar citirea și scrierea datelor sunt

26
seriale și pot fi realizate pe un singur canal o dată. De asemenea, eșantionarea în ADC se realizează
odată cu transmisia către FPGA, cu alte cuvinte eșantionul următor este citit și memorat în
momentul în care eșantionul curent este transmis pentru a fi prelucrat. DAC-ul are un
comportament asemănător cu cel al ADC-ului, în sensul că, la ieșirea sa este prezent eșantionul
curent, ieșirea nu se modifică atâta timp cât eșantionul următor este scris. Figura 2.2 prezintă o
secvență de citire și scriere corectă, împreună cu timpii necesari pentru a realiza acest proces. De
asemenea, timpii minimi se regăsesc în datasheet-urile ADC-ului și al DAC-ului. Modelul de ADC
folosit este Linear Techology LTC1865L, iar modelul de DAC este Linear Techology LTC1645.
Placa FPGA este produsă de Nu Horizons Electronics Corporation. O descriere amanunțită a
funcționării ADC-ului se regasește în subcapitolul 2.3.2 și a DAC-ului în subcapitolul 2.3.3.

t expediere la FPGA
tconv eșantion eșantion curent
ADC recepție eșantion
curent următor

t livrare
eșantion
DAC următor

t propagare
Sistem laser / prin circuitul
laser / FD
fotodiodă
 

Figura 2.2 - Transmisia și recepția sincronizată a unui bit prin sistem

În figura 2.2 se observă că DAC-ul trebuie să livreze un eșantion la ieșire înainte ca recepția
eșantionului următor să fie realizată de ADC. De asemenea, trebuie ținut cont și de timpii de
propagare ai semnalului prin sistemul laser - fotodiodă. Timpul de propagare laser - fotodiodă este
reprezentat de timpii de creștere și de scădere a semnalului și stabilizarea acestuia pe FD (semnalul
este dreptunghiular). Menționez că, odată cu recepția unui eșantion de către ADC, trebuie specificat
și canalul de pe care va fi realizată citirea următoare. Acest amănunt influențează procesul în
momentul în care trebuie preluat un nou eșantion audio după ultimul eșantion de semnal digital
recepționat.
În tabelul 2.1 este reprezentat un ciclu complet de citire, scriere și transmisie a unui eșantion
audio împreună cu zonele în care se face selecția urmatorului canal al ADC-ului și canalul curent al
DAC-ului. Intrările ADC-ului sunt CH0 pentru citirea eșantioanelor audio și CH1 pentru citirea
eșantioanelor digitale. Ieșirile DAC-ului sunt VoutA pentru livrarea eșantioanelor audio și VoutB
pentru livrarea eșantioanelor digitale.

27
Stare 0 1 2 3 4 5 6 7 8 9 0
ADC CH0 SW CH1 CH1 CH1 CH1 CH1 CH1 CH1 CH1 CH0
audio CH1 bit1 bit2 bit3 bit4 bit5 bit6 bit7 bit8 audio
SW
CH0
DAC VoutA VoutB VoutB VoutB VoutB VoutB VoutB VoutB VoutB VoutA
audio bit1 bit2 bit3 bit4 bit5 bit6 bit7 bit8 audio

Tabelul 2.1 - Ciclul complet de citire - scriere și transmisie digitală a unui eșantion audio

În starea 0 este citit eșationul audio curent (CH0), iar eșantionul audio precedent (VoutA)
este livrat la ieșire. În starea 1 este selectat canalul de recepție CH1 (eșantioane digitale) al ADC-
ului, iar în DAC, pe ieșirea VoutB, este livrat primul bit. În stările 2-8, ADC-ul va citi tot timpul
bitul precedent livrat de DAC. În starea 9, DAC-ul nu va mai livra niciun bit (valoarea de la ieșirea
DAC-ului se menține cea din starea 8), iar ADC-ul va citi ultimul bit livrat de DAC. Procesul se
reia apoi de la starea 0, realizându-se ciclicitatea. La inițializarea procesului, fără a avea niciun
eșantion precedent, toate valorile livrate de DAC vor fi zerouri iar ADC-ul va prelua primul
eșantion audio.
Timpii alocați fiecărei stări sunt dependenți de viteza de conversie și eșantionare a ADC-
ului, viteza de conversie a DAC-ului și timpii de propagare a semnalului prin sistemul laser -
fotodiodă. Studiind datasheet-urile și lucrarea practică au rezultat timpii prezentați în tabelul 2.2.

Componentă Timpi Detalii


ADC tCYC ADC = 16SCK + SCK - frecvența maximă de eșantionare, 8MHz
tCONV = 16*125ns + 3.7s tCONV - timpul de conversie, tipic 3.7s, dar se pot
= 5.7s experimenta și timpi mai mici prin încercări succesive
tCYC ADC - timpul minim pentru un ciclu de conversie
DAC tCYC DAC = 3s în tCYC DAC - timpul minim pentru un ciclu de conversie
conversie rapida
LASER t creștere ~ 1s t creștere - este reprezentat de viteza cu care driver-ul
variază curentul în dioda laser, sub 1s
FD t creștere ~ 0.6s t creștere - fotodioda lucrează în regim fotovoltaic pe o
sarcină rezistivă de 64. Capacitatea fododiodei este
600pF. Frecvența de tăiere este > 4MHz. Timpul de
creștere este ~0.6s
FPGA t ciclu = 20ns t ciclu - timpul de execuție al unui ciclu intern.
Frecvența oscilatorului local din FPGA este 50MHz

Tabelul 2.2 - Timpii minimi de lucru ai componentelor sistemului

Din tabelul 2.2 se observă că timpul minim de conversie al unui eșantion în ADC este 5.7s.
Timpul minim de conversie al unui eșantion în DAC este 3s, iar timpul maxim de propagare al
semnalului prin sistemul laser - fotodiodă nu depașeste 1.6s (este improbabil să se ajungă la acest
timp deoarece în momentul în care semnalul începe să crească pe laser va crește implicit și pe
fotodiodă).

28
Comparând acești timpi se observă că timpul necesar scrierii unui bit în DAC la ieșirea
VoutB și livrarea în ADC la CH1 este de maxim 4.6s > 5.7s, timpul necesar pentru un ciclu al
ADC. Simultan, trebuie ținut cont de faptul că un eșantion în ADC se preia după primele 3.7s, cu
alte cuvinte timpul în care este livrat un eșantion la intrarea ADC-ului trebuie să fie maxim 3.7s.
Conform calculelor de mai sus acest timp este 4.6s. În aceste condiții există mai multe variante de
rezolvare astfel: testarea experimentală a unui timp de conversie mai mic de 3.7s pentru ADC și
forțarea sa spre limite, forțarea spre limită a timpului de conversie al DAC-ului, forțarea unui timp
mai mic de lucru pentru sistemul laser - fotodiodă sau creșterea timpului de conversie al ADC-ului
până la limita la care semnalul ajunge la intrarea sa. În tabelul 2.3 sunt analizate toate aceste
variante împreună cu șansele de realizare și efectele ce pot apărea în timpul funcționării.

Varianta de lucru Posibile probleme Șanse de realizare


Timp de conversie În această situație ADC-ul poate să rateze Este realizabil, dar câștigul este
sub 3.7s pe ADC convesia completă și implicit să se nesemnificativ față de
reseteze sau să apară defecte interne. Dacă problemele ce pot apărea.
eșantionul în curs este complet ratat, poate
produce un eșantion cu altă valoare la
ieșire.
Timp de conversie În această situație DAC-ul poate să rateze Este realizabil, dar câștigul este
sub 3s pe DAC convesia completă și implicit să se nesemnificativ față de
reseteze sau să apară defecte interne. Dacă problemele ce pot apărea.
eșantionul în curs este complet ratat, poate
produce un eșantion cu altă valoare la
ieșire.
Scăderea timpului în În această situație se va schimba design-ul Este realizabil, dar schimbă
sistemul laser - FD driver-ului laser pentru o comutare mai substanțial design-ul simplu al
eficientă. Pentru fotodiodă se poate pune o driver-ului.
sarcină rezistivă de valoare mai mică,
implicit tensiunea din circuit scade și este
mai greu de realizat detecția corectă pe
ADC.
Prelungirea timpului În această situație frecvența de eșantionare Este realizabil, nu schimbă
de conversie cu un totală a circuitului scade, dar design-ul nu design-ul, scade frecvența
timp de staționare este deloc modificat. audio maximă.
până când semnalul
ajunge la intrare

Tabelul 2.3 - Variante de reducere a timpului în care un eșantion digital ajunge de la DAC la ADC

Opțiunea, în aceast caz, a fost de a prelungi timpul de conversie deoarece nu se schimbă


deloc design-ul circuitului chiar dacă frecvența audio maximă este mai mică (trebuie ținut cont că
majoritatea track-urilor audio se aud acceptabil la o frecvență maximă de la 8-10KHz). Valorile
finale sunt prezentate în tabelul 2.4.

29
Timp ales Valoare
Timp conversie semnal audio pe ADC CH0 5.28s
Timp conversie semnal audio pe DAC VoutA 3s
Timp conversie semnal digital pe FD ADC CH1 6.84s
Timp conversie semnal digital pe DAC VoutB 3s
Timp de propagare implicit în sistemul laser - FD 1.6s

Tabelul 2.4 - Timpii de lucru ai componentelor sistemului

Din tabelul 2.4 se observă că pe ADC succesiunea este: 3.7s timp conversie, 1.22s timp
de prelungire a conversiei pentru ca urmatorul eșantion să treacă prin DAC și sistemul laser - FD și
1.92s timp de eșantionare. De asemenea, timpul de trecere al semnalului prin DAC și laser - FD
este 3s + 1.6s = 4.6s < 3.7s + 1.22s = 4.92s pe ADC. Pentru o optimizare mai bună se poate
reduce experimental acest timp la minim. Eu am ales timpii prezentați mai sus în realizarea practică
a proiectului. În acest moment timpii stărilor sunt reprezentați de timpul cel mai mare, și anume,
timpul unei conversii în ADC. Având aceste valori calculate, putem completa tabelul 2.1 cu timpii
aferenți fiecărei stări, rezultatele fiind reprezentate în tabelul 2.5.

Stare 0 1 2 3 4 5 6 7 8 9
ADC CH0 SW CH1 CH1 CH1 CH1 CH1 CH1 CH1 CH1
audio CH1 bit1 bit2 bit3 bit4 bit5 bit6 bit7 bit8
SW
CH0
tstare 5.28s 6.84s 6.84s 6.84s 6.84s 6.84s 6.84s 6.84s 6.84s 6.84s

Tabelul 2.5 - Timpii alocați fiecarei stări a procesului

Studiind tabelul 2.5 se deduce timpul în care un eșantion audio este preluat și trecut prin tot
procesul prin însumarea timpilor aferenți fiecărei stări. Timpul unui ciclu este 5.28s + 9*6.84s =
66.84s. Frecvența de lucru este 14.961KHz, rezultând o frecvență maximă a semnalului audio de
7.48KHz, peste această frecvență apare subeșantionarea. Având în vedere acest aspect, singurele
utilități ale acestui dispozitiv sunt cea didactică și transmisia de voce.
Frecvența cu care sunt expediate eșantioanele pe laser este 1/6.84s = 146.19KHz, drept
urmare modularea laserului în amplitudine se realizează la această frecvență.

2.3.2 Recepția semnalelor analogic și digital. Implementarea achiziției prin ADC

Procesul de achiziție de date presupune citirea intrărilor ADC-ului conform procesului


descris în subcapitolul 2.3.1. În aceast subcapitol voi prezenta cum se realizează citirea
informațiilor, structura digitală a modulului de achiziție de date și rezultatele simulării acestui
modul.

2.3.2.1 Procesul de citire al ADC

ADC-ul de care dispune placa de dezvoltare FPGA este modelul Linear Technology
LTC1865L, cu două intrări analogice și citire digitală serială a informației. Avantajul acestui model

30
de ADC îl reprezintă viteza mare de preluare a informației, poate citi până la 150K eșantioane într-o
secundă. De asemenea, treapta de cuantizare este mică putând reprezenta eșantioanele pe 16 biți.
Tensiunea de alimentare recomandată de producător este 3V, drept urmare un bit la această tensiune
reprezintă 15.25V.
În lucrarea de față voi folosi canalul CH0 pentru a prelua eșantioane din semnalul audio
livrat de utilizator iar canalul CH1 pentru a prelua semnalul livrat de către fotodiodă. După cum am
precizat și în subcaptitolul anterior, odată cu citirea unui eșantion din ADC trebuie specificat și
canalul de pe care va fi preluat eșantionul următor, drept urmare este necesară cunoașterea în orice
moment a numărului de ordine al eșantionului curent și tipul de eșantion care îl succede. În tabelul
2.6 este reprezentată citirea fiecărui eșantion împreună cu canalul de pe care eșantionul este preluat
și canalul de pe care va fi preluat următorul eșantion.

Eșantion curent 0 1 2 3 4 5 6 7 8 9
Canal curent CH0 CH1 CH1 CH1 CH1 CH1 CH1 CH1 CH1 CH1
Următorul canal CH1 CH1 CH1 CH1 CH1 CH1 CH1 CH1 CH1 CH0

Tabelul 2.6 - Selecția canalului următor în funcție de starea procesului de citire

Așa cum se observă în tabelul 2.6, se va comanda schimbarea canalului din CH0 în CH1
când eșantionul 0 este citit și schimbarea din CH1 în CH0 când eșationul 9 este citit.
Procesul de citire al eșantioanelor este realizat prin implementarea unui automat cu patru
stări. Primele două stări (stările 0 și 1) ale automatului reprezintă citirea unui eșantion de pe CH0,
ultimele două stări (stările 2 și 3) reprezintă citirea unui eșantion de pe CH1. În tabelul 2.7 sunt
prezentate cele patru stări și operațiile efectuate în cadrul acestora. Ciclul de ceas cu care este operat
ADC-ul este divizat din ceasul FPGA-ului și are șase ciclii de ceas FPGA. Un ciclu de ceas FPGA
are 20ns, drept urmare un ciclu de ceas în ADC va avea 120ns.

Starea Canal Ciclii de Operație


ceas
0 CH0 28 Așteaptă timpul necesar pentru ca eșantionul audio să fie convertit. Se
trece la starea 1.
1 CH0 16 Trimite semnal de ceas spre ADC și citește sincronizat semnalul de
date. În primii doi ciclii trimite selecția canalului CH1 sincronizat cu
semnalul de ceas. Se trece la starea 2.
2 CH1 41 Așteaptă timpul necesar ca semnalul să ajungă din DAC și din
sistemul laser fotodiodă pe ADC. Se trece întotdeauna la starea 3.
3 CH1 16 Trimite semnal de ceas spre ADC și citește sincronizat semnalul de
date. În primii doi ciclii trimite selecția canalului următor sincronizat
cu semnalul de ceas. Întotdeauna după a noua citire pe CH1 se trece la
starea 0 și implicit se selectează canalul CH0, altfel se trece la starea 2.

Tabelul 2.7 - Stările procesului de citire a informației pe ADC

31
2.3.2.2 Implementarea digitală a citirii ADC

Blocul digital ce realizează interconectarea cu ADC-ul fizic și procesul părinte de citire-


scriere este reprezentat în figura 2.3.

               

Figura 2.3 - Blocul digital de citire ADC

Datele de intrare și de ieșire din blocul ADC sunt prezentate în tabelul 2.8.

Semnale de intrare Semnale de ieșire


reset - flag de reset global primit de la FPGA. spi_ad_sck - semnal de ceas livrat catre ADC,
Inițializează cu valorile default toate registrele sincron cu acest semnal se va citi spi_ad_sdo.
componente Numărul de perioade livrate spre ADC este de
16
clk_adc - semnal de ceas divizat din semnalul de ad_conv_st - semnal start conversie livrat către
ceas al FPGA-ului ADC. În starea 1 ADC-ul va realiza conversia,
în starea 0 va aștepta ceasul pentru a transmite
eșantionul curent și a primi informațiile despre
următorul canal. Trebuie menținut în starea 1
minim 3.7s
adc_start - flag de start, realizează trecerea la sdi - semnal trimis sincronizat cu ceasul prin
urmatoarea stare a automatului când este pe 1 care se specifică urmatorul canal ce se dorește a
fi folosit. Pentru CH0 secvența expediată este 01
iar pentru CH1 secvența expediată este 11
spi_ad_sdo - linia de date serială de la ADC signal[15b] - semnalul preluat pe ultimul ciclu
sincronizată pe ceasul spi_ad_sck, semnalul de conversie finalizat
receptionat fiind reprezentat de la MSB la LSB
done - flag de confirmare către circuitul părinte
prin care se confirmă recepția unui eșantion
state - flag prin care se specifică dacă ADC-ul
este în conversie sau în preluare eșantion. Este
folosit pentru debug
32
sample_counter[5b] - reprezintă numărului
eșantionului în lucru și implicit starea
automatului.

Tabelul 2.8 - Datele de intrare și de ieșire din procesul de citire ADC

Interfața cu ADC-ul este o interfață serial - paralelă deoarece recepționează un semnal serial
(spi_ad_sdo) și îl convertește într-un semnal paralel (signal[8b]). O simulare a citirii ADC-ului este
reprezentată în figura 2.4.

Figura 2.4 - Ciclul de citire al unui eșantion din ADC

După cum se observă în figura 2.4, în primii 28 de ciclii de ceas semnalul ad_conv_st are
valoarea 1, drept urmare, procesul este în starea 2 (doarece semnalul ch este 1), iar ADC-ul
realizează conversia. Imediat ce semnalul ad_conv_st ia valoarea 0 procesul trece în starea 3 și se
realizează citirea eșantionului de date din spi_ad_sdo, care are valoarea 1 pe tot parcursul
conversiei, drept urmare valoarea finală este 65535, valoarea regăsită după recepția integrală a
datelor în signal_received. De asemenea, imediat după trecerea în starea 1 semnalul sdi ia valoarea
1 preț de două cicluri de ceas ceea ce reprezintă selecția canalului CH1 pentru următoarea
conversie. Semnalul de ceas trimis către ADC este negat (în specificația producătorului se regăsește
acest aspect). Semnalul adc_start are valoarea 1 pe parcusul citirii eșantionului. Numărul de ciclii
din starea 2 a fost ales 28 pentru a putea face o reprezentare vizibilă în pagină. Dacă am fi măsurat
fizic ADC-ul și acesta ar fi prezentat ieșirea de date ca în acest exemplu, tensiunea de la intrarea
CH1 ar fi trebuit sa fie VREF - VLSB = 3V - 15.25V.

2.3.3 Transmisia semnalelor analogic și digital. Implementarea expedierii prin DAC

Procesul de transmisie de date presupune expedierea datelor pe ieșirile DAC-ului conform


procesului descris în subcapitolul 2.3.1. În acest subcapitol voi prezenta cum se realizează
transmisia informațiilor, structura digitală a modulului de transmisie de date și rezultatele simulării
acestui modul.

2.3.3.1 Procesul de scriere al DAC

DAC-ul de care dispune placa de dezvoltare FPGA este modelul Linear Tehnology
LTC1654 cu două ieșiri selectabile. Acest DAC realizează conversia digital - analogă a unui semnal
pe 14 biți, încărcarea sa este serială, frecvența maximă de ieșire a semnalului analogic este de

33
900KHz. DAC-ul LTC1654 dispune de două ieșiri configurabile în momentul în care eșantionul
este expediat. Tensiunea de alimentare recomandată de producător este între 3V și 5V. În cazul în
care tensiunea de referință este aleasă 3V, treapta cea mai mică de tensiune va fi VLSB = 0.183mV.
Protocolul de comunicație cu DAC-ul este serial. Pentru o utilizare corectă a DAC-ului este
necesară execuția a două operații: inițializarea și încărcarea de date. Fiecare operație este urmată de
o conversie. Trenul de impulsuri de date are următorul format: 4 biți de control, 4 biți de adresă, 14
biți de date și 2 biți a căror valoare nu este relevantă. Biții de date sunt trimiși de la MSB la LSB.
Reprezentarea biților de date este fără semn. Cu alte cuvinte, pentru un tren de 14 zerouri semnalul
de ieșire este 0, pentru un tren de 14 unuri, valoarea semnalului de ieșire este VREF-VLSB. Operația
de inițializare presupune trimiterea următorului set de biți către DAC, la pornirea acestuia:
0101 xxxx xxxx xxxx xxxx xxxx

Biții de control vor seta convertorul în conversie rapidă. Operația de încarcare de date
presupune trimiterea următorului set de biți către DAC:

0011 0000 XXXX XXXX XXXX XXxx pentru ieșirea VoutA

0011 0001 XXXX XXXX XXXX XXxx pentru ieșirea VoutB

Biții marcați cu X reprezintă biții de date în ordinea MSB->LSB. De asemenea, după fiecare
încărcare cu date este necesară trecerea semnalului de start conversie în starea 1. Atâta timp cât se
trimite semnalul de date, este necesar și un semnal de ceas. Pe frontul pozitiv al acestui ceas se
realizează citirea datelor în interiorul DAC-ului. Semnalul de ceas este divizat la patru ciclii de ceas
intern ceea ce conduce la o perioadă de 4*20ns = 80ns. Timpul scurs pentru o conversie completă
este timpul de expediere al tuturor celor 24 de biți împreună cu un timp suplimentar în care DAC-ul
va executa conversia și va scoate rezultatul la ieșire, de unde se obține un timp de 1.92s/trimitere
de date și 1.08s în care DAC-ul nu efectuează nicio operație. Timpul final pentru o conversie este
de 3s sau mai mare, în funcție de viteza cu care sunt livrate eșantioanele și de timpul la care
conversia este pornită (depinde de procesul părinte când este făcută comanda).

2.3.3.2 Implementarea digitală a scrierii DAC

Blocul digital ce realizează interconectarea cu DAC-ul fizic și procesul părinte de citire-


scriere este reprezentat în figura 2.5.

Figura 2.5 - Blocul digital de scriere DAC


34
Datele de intrare și de ieșire din blocul DAC sunt prezentate în tabelul 2.9. 

Semnale de intrare Semnale de ieșire


reset - flag de reset global primit de la FPGA. cs_ld_n_dac - semnal "start conversie"
Inițializează cu valorile default toate registrele
componente
clk - semnal de ceas divizat din semnalul de ceas sck_dac - semnal de ceas către DAC
al FPGA-ului
signal[13b] - semnalul digital ce va fi convertit sdi_dac - semnal de date către DAC
în semnal analogic
ch - flag de selecție canal de ieșire. În starea 0 done - semnal de confirmare scriere eșantion,
ieșirea selectată este VoutA iar în starea 1 ieșirea semnalul este livrat către procesul părinte
selectată este VoutB
dac_start - semnal start conversie primit de la
procesul părinte. în starea 1 conversia
semnalului signal poate începe

Tabelul 2.9 - Datele de intrare și de ieșire din procesul de scriere DAC

Intefața cu DAC-ul este paralel - serială deoarece recepționează un semnal paralel (signal) și
îl convertește într-un semnal serial (sdi_dac). O simulare a scrierii DAC-ului este reprezentată în
figura 2.6.

Figura 2.6 - Ciclul de scriere al unui eșantion în DAC

După cum se observă în figura 2.6, o conversie este realizată în momentul în care dac_start
trece în starea 1. Semnalul scris în DAC este pe 13 biți și are valoarea 1111111100000. Semnalul
sdi_dac prezintă două zone cu fronturi pozitive, în prima zonă sunt scriși biții de comandă (0011),
apoi biții de date (8 biți de 1 și 5 de 0). Zona de comandă a ieșirii este între cele două fronturi pe 0
(VoutA). La sfârșitul expedierii eșantionului semnalul done ia valoarea 1 și semnalul de ceas către
DAC este oprit. Dacă aș fi măsurat fizic DAC-ul și acesta ar fi prezentat intrarea de date ca în acest
exemplu, tensiunea de la ieșirea VoutA ar fi trebui să fie (1111111100000)2 * 3/214 = 26*255*3/214
= 2.988V.

2.3.4 Implementarea digitală a procesului de citire - scriere

După cum am prezentat în subcapitolul 2.3.1, transmisia unui eșantion audio prin sistem se
realizează în urma unui proces complex de citire - scriere. Procesul de mai sus va fi implementat cu

35
ajutorul unui automat cu zece stări, fiecare stare corespunde unei perechi de acțiuni citire - scriere,
fapt evidențiat în tabelul 2.1. Stările automatului și trecerea între stări este prezentată în tabelul
2.10.

Stare Acțiune executată pe ADC Acțiune executată pe DAC Trece la


stare
0 Citește un eșantion pe CH0(audio) Scrie un eșantion audio pe VoutA (audio) 1
1 Nicio acțiune Scrie eșantionul corespunzător bitului 1 2
pe VoutB
2 Citește eșantionul corespunzător Scrie eșantionul corespunzător bitului 2 3
bit-ului 1 pe CH1 pe VoutB
3 Citește eșantionul corespunzător Scrie eșantionul corespunzător bitului 3 4
bit-ului 2 pe CH1 pe VoutB
4 Citește eșantionul corespunzător Scrie eșantionul corespunzător bitului 4 5
bit-ului 3 pe CH1 pe VoutB
5 Citește eșantionul corespunzător Scrie eșantionul corespunzător bitului 5 6
bit-ului 4 pe CH1 pe VoutB
6 Citește eșantionul corespunzător Scrie eșantionul corespunzător bitului 6 7
bit-ului 5 pe CH1 pe VoutB
7 Citește eșantionul corespunzător Scrie eșantionul corespunzător bitului 7 8
bit-ului 6 pe CH1 pe VoutB
8 Citește eșantionul corespunzător Scrie eșantionul corespunzător bitului 8 9
bit-ului 7 pe CH1 pe VoutB
9 Citește eșantionul corespunzător Nicio acțiune 0
bit-ului 8 pe CH1

Tabelul 2.10 - Stările automatului de citire - scriere

Pentru a realiza trecerea între stări este necesar ca starea curentă să aibă disponibile două
eșantioane: eșantionul citit de ADC și eșantionul ce trebuie livrat DAC-ului. De asemenea, trebuie
luat în considerare faptul că pe ADC, odată cu livrarea eșantionului curent, se face eșantionarea
corespunzătoare eșantionului următor. În aceste condiții este necesar ca în starea 1 ADC-ul să nu
livreze date, dar să fie comandat pentru a citi canalul CH1 (în starea 9 a fost comandat pentru CH0),
citirea se realizează în starea 2. În starea 9, se întâlnește aceeași situație din cauza decalajului
produs la starea 1. DAC-ul nu va mai livra niciun eșantion nou de date în timp ce ADC-ul va citi
ultimul bit expediat.
Algoritmul după care rulează automatul din prespectiva lucrului cu semnalul inițial și cu
semnalul reconstituit este descris de pseudocodul următor:

stare = 0
semnal_audio = 0//semnalul audio citit pe ADC
semnal_audio_reconstituit = 0//semnalul audio reconstituit din esantioane
PRAG = 0000000001111111 //corespunzator valorii 3.89mV

daca stare = 0 atunci


| semnal_audio = citeste semnal ADC pe CH0//(15 biți în ordinea MSB - LSB),
| //folosim doar primii 8 biți,

36
| // restul sunt 0
| scrie în DAC semnal_audio_reconstituit în VoutA
| stare = 1
|------

daca stare = 1 atunci


| daca(semnal_audio[15] == 1)//primul bit
| | scriu în DAC valoarea 11111111 //valoarea ce produce tensiunea
| |---- //maxima la ieșire
| altfel
| | scriu în DAC valoarea 0 //valoare ce produce tensiune 0
| |----
| comand ADC-ul sa citeasca canalul CH1
| stare = 2
|------

daca stare = 2 … 8
| daca(semnal_audio[16-stare] == 1)
| | scriu în DAC valoarea 11111111 //valoarea ce produce tensiunea
| | //maxima la ieșire, folosim doar
| |---- //primii 8 biți, restul sunt 1
| altfel
| | scriu în DAC valoarea 0 //valoare ce produce tensiune 0
| |----
|
| daca(semnal repectionat pe ADC > PRAG)
| | semnal_audio_reconstituit[9-stare] = 1
| |----
| altfel
| | semnal_audio_reconstituit[9-stare] = 0
| |----
| comand ADC-ul sa citeasca canalul CH1
| stare = stare + 1
|------

daca stare 9
| daca(semnal repectionat pe ADC > PRAG)
| | semnal_audio_reconstituit[0] = 1
| |----
| altfel
| | semnal_audio_reconstituit[0] = 0
| |----
| comand ADC-ul sa citeasca canalul CH0
| stare = 0
|------

După studierea codului descris se observă că lucrul cu ADC-ul implică citirea unui eșantion
audio în starea 0 pe CH0 iar apoi spargerea acestui eșantion în biți începând cu MSB-ul, fiecare bit
este expediat pe DAC. Treptele de tensiune livrate de DAC sunt 0V pentru un bit 0 și aprox 3V
pentru un bit de 1. De asemenea, citirea eșantioanelor digitale pe ADC presupune citirea valorii
semnalului aferent bitului în curs și compararea acestei valori cu un prag de decizie. În cazul în care
semnalul recepționat are valoare mai mică de 3.89mV este interpretat ca fiind un 0, iar în cazul în
care semnalul are valoare peste 3.89 mV este interpretat ca fiind un 1. Pentru a menține simplitatea

37
codului nu am implementat niciun corector sau detector de erori. Utilitatea corectorului este
evidentă, utilitatea detectorului este reprezentată de faptul că în cazul unei erori detectate ce nu
poate fi corectată, la ieșire va fi transmis încă odată ultimul eșantion redat pe DAC. Drept urmare
nu există riscul să apară spike-uri de tensiune la ieșire. În tabelul 2.11 voi realiza o simulare a
trasmiterii unui eșantion urmând procesul descris mai sus.

Stare ADC CH0 ADC CH1 DAC VoutB DAC VoutA Semnal reconstituit
0 10110011 - - eș anterior -
1 - - 11111111 - -
2 - citesc valoare peste 0 - 10000000
PRAG
3 - citesc valoare sub 11111111 - 10000000
PRAG
4 - citesc valoare peste 11111111 - 10100000
PRAG
5 - citesc valoare peste 0 - 10110000
PRAG
6 - citesc valoare sub 0 - 10110000
PRAG
7 - citesc valoare sub 11111111 - 10110000
PRAG
8 - citesc valoare peste 11111111 - 10110010
PRAG
9 citesc valoare peste - - 10110011
PRAG
0 eș următor - 10110011 -

Tabelul 2.11 - Simularea expedierii unui eșantion prin procesul de citire - scriere

După cum se observă în tabelul 2.11, o expediere corectă urmează algoritmul descris mai
sus. Sursa principală de erori în acest caz este detecția corectă a semnalului recepționat. Pragul
trebuie fixat corect pentru a minimiza posibilitatea luării unor decizii eronate. În această lucrare
pragul rămâne fix. Așadar, singura variantă rămasă pentru a minimiza erorile este reglarea corectă a
intensității fasciculului laser. Blocul digital ce realizează procesul de citire-scriere este reprezentat
în figura 2.7.

38
 

Figura 2.7 - Blocul digital al procesului

Datele de intrare și de ieșire din modulul procesului sunt descrise în tabelul 2.12.

Semnale de intrare Semnale de ieșire


reset - flag de reset global primit de la FPGA. dac_sgn[13b] - semnalul ce va fi scris în DAC
Inițializează cu valorile default toate registrele
componente
clk - semnal de ceas divizat din semnalul de ceas dac_ch - selectorul canalului DAC-ului,
al FPGA-ului valoarea 0 pentru VoutA, 1 pentru VoutB
adc_sgn[15b] - semnalul recepționat de ADC dac_start - flag către DAC, pornește conversia
eșantionului curent
adc_sample_counter[5b] - numărul de ordine al adc_start - flag către ADC, pornește recepția
eșantionului preluat de ADC eșantionului de la intrare
adc_done - flag confirmare de la ADC, confirmă digital_audio_sample_reg[8b] - valoarea în
scrierea eșantionului în curs și implicit starea curentă a semnalului ce se reconstituie
avansarea la starea următoare (folosit pentru debug)
dac_done - flag de confirmare de la DAC, audio_sample_received[16b] - valoarea
confirmă scrierea eșantionului curent semnalului recepționat pe CH0 (folosit pentru
debug)
process_state[4b] - starea curentă a procesului
(folosit pentru debug)
last_output_audio_dac[8b] - ultimul eșantion
livrat pe DAC (folosit pentru debug)

Tabelul 2.12 - Datele de intrare și de ieșire din modulul procesului de citire - scriere

O simulare a rulării procesului digital este prezentată în figura 2.8.

39
Figura 2.8 - Trecerea automatului între stări și selecția canalelor ADC și DAC

După cum se observă în figura 2.8, în starea 0 ADC-ul are selectat CH0 și DAC-ul ieșirea
VoutA(dac_ch este 0). În celelalte stări, pe ADC este selectat CH1, iar pe DAC este selectată
ieșirea VoutB(dac_ch este 1). De seamenea, bit_counter se incrementează de fiecare dată când un
bit sosește pe DAC. Primul bit sosit este în starea 2 (valoarea bit_counter este 0), iar ultimul sosit
este în starea 9 (valoarea bit_counter este 7). Semnalele efective nu au fost reprezentate în această
simulare pentru a avea o diagramă vizibilă în pagină.

2.3.5 O privire de ansamblu asupra circuitului digital. Modulul de top

Modulul de top reprezintă asamblarea modulelor ce compun circuitul digital ce va fi scris în


FPGA. Pe lângă circuitele descrise până acum se mai află și două circuite divizoare de ceas, unul ce
divide ceasul de pe placă cu patru, perioada semnalului rezultat este 4*20ns = 80ns, utilizat de DAC
și unul ce divide perioada cu șase, perioada semnalului rezultat este 6*20ns = 120ns, utilizat de
ADC. Divizoarele sunt implementate simplu cu numărător și comparator. Prezentarea lor în detaliu
se regăsește în cursurile de circuite integrate digitale (CID) și în lucrările de laborator ale aceluiași
curs. Structura modulului de top este prezentată în figura 2.9.

 
Figura 2.9 - Structura modulului de top

40
Ieșirile din acest modul sunt legate fizic în exterior la ADC, DAC, oscilatorul local de
50MHz și un buton pentru resetare. Codul sursă ce implementează modulele se găsește în anexa 3.

2.4 Proiectarea sistemului optic de transmisie - recepție

Sistemul optic de transmisie - recepție implementează transmiterea biților componenți ai


eșantioanelor audio prin laser și recepția pe o fotodiodă. Laserul este modulat intern în intensitate,
prezentând o intensitate luminoasă mare pentru biții cu valoarea 1 și o intensitate luminoasă mică
pentru biții cu valoare 0. Două părți distincte alcătuiesc acest sistem: prima parte este reprezentată
de sistemul de transmisie format din DAC, driver-ul laser implementat cu componente discrete și
dioda laser, a doua parte este reprezentată de ADC, fotodiodă și sarcina pe care fotodioda lucrează.

2.4.1 Sistemul de transmisie

Sistemul de transmisie este compus din ADC, driver-ul laser și dioda laser.
Dioda laser aleasă provine dintr-un laser de buzunar și are specificațiile:
 lungime de undă: 650nm  10nm (roșu);
 putere optică maximă: 5mW (la limita distrugerii diodei, în curent continuu);
 curent continuu maxim: 30mA;
 curentul de prag: 10mA;
 tensiunea maximă inversă: 2V;
 putere optică recomandată: 1mW;
 tensiune la curentul de prag: 2.2V;
 putere electrică maximă: 70mW.

De asemenea, driver-ul laser are specificațiile:


 tensiune de alimentare: 5V stabilizat;
 curent maxim prin dioda laser: 22mA;
 frecvența comutării curentului prin laser: 150KHz.

DAC-ul produce la ieșire următoarele tensiuni:


 3V pentru un bit cu valoare 1;
 0V pentru un bit cu valoare 0.

În continuare voi prezenta driver-ul laser, PSF-ul și simularea funcționării driver-ului.

2.4.1.1 Driver-ul laser

Driver-ul laser este, în esență, o sursă de curent comandată în tensiune. În cazul în care la
ieșirea DAC-ului este prezentă o tensiune de 0V curentul prin laser trebuie să fie apropiat de
curentul de prag. Dacă la ieșirea DAC-ului este prezentă o tensiune de 3V, curentul trebuie să se
apropie de valoarea maximă acceptată de 22mA, dar este ideal să nu o depășească, altfel protecția
driver-ului se va declanșa și va limita valoarea curentului prin dioda laser. Circuitul driver-ului este
prezentat în figura 2.10.

41
VCC
5V D5

1N4001
LED1
R1

66Ω

R6
1kΩ
Q1
V1 R2
150kHz R5 330Ω
3V 5kΩ 50% BD139
Key=A R4 Q2

1kΩ
27%
Key=A 2N3904
R3
31Ω

Figura 2.10 - Schema driver-ului laser

Așa cum este reprezentat în schema din figura 2.10, driver-ul laser este compus din: o sursă
de semnal dreptunghiular cu amplitudine 3V Vpp și o componentă continuă de 1.5V (pentru ca
frontul negativ să aibă valoarea 0V și frontul pozitiv 3V), care simulează ieșirea DAC-ului; două
tranzistoare Q1 și Q2; două potențiometre R4 și R5; patru rezistențe R1, R2, R3 și R6; dioda laser
LED1 și dioda D5.
Dioda D5 în circuit are rol de protecție. În cazul în care la bornele diodei laser apare o
tensiune inversă, dioda se va deschide și tensiunea inversă maximă ce va apărea pe dioda laser va fi
sub 1V.
Specificațiile tranzistoarelor sunt: Q1 cu BF = 124, VBE = 0.67V și Q2 cu BF = 416, VBE =
0.66V. Voi analiza în cele ce urmează trei cazuri în care se poate afla circuitul (intrarea dinspre
DAC este în gol, intrarea dinspre DAC este 0V, intrarea dinspre DAC este 3V).

Analiza funcționării circuitului în curent continuu cu intrarea dinspre DAC în gol

Acest caz poate apărea în momentul în care driver-ul laser este alimentat și funcțional dar
placa FPGA nu este alimentată, drept urmare ieșirea DAC-ului se comportă ca un gol. Circuitul ce
va fi analizat este prezentat în figura 2.11.

42
VCC
5V D5

1N4001
LED1
R1

66Ω
R6
1kΩ Q1
A
R4 BD139
1kΩ Q2
27%
Key=A B

2N3904
R3
31Ω

Figura 2.11 - Driver-ul laser cu intrare dinspre DAC în gol

După cum se observă, din circuitul de bază lipsesc sursa de semnal dreptunghiular împreună
cu rezistența R2 și potențiometrul R5. De asemenea, în circuitul de mai sus valoarea
potențiometrului R4 este de 270.
Considerăm inițial curentul în baza tranzistorului Q1 și curentul prin Q2 neglijabili. În
aceste condiții potențialul în punctul A este VA = VCCR4/(R6+R4) = 5*270/1270 = 1.063V,
rezultând potențialul VB = VA - VBEQ1 = 1.063 - 0.67 = 0.393V. Curentul de colector al
tranzistorului Q1 este IQ1 = VB / R3 = 12.6mA. De asemenea, VBEQ2 = VB = 0.393V, așadar
tranzistorul Q2 este închis iar IQ2 poate fi considerat 0. Curentul de bază al tranzistorului Q1 este
IBQ1 = ICQ1/BFQ1 = 12.6mA/124 = 0.1mA.
Pentru a actualiza calculul potențialului VA cu datele de mai sus, calculăm rezistența ce se
vede între baza tranzistorului Q1 și masă, RBQ1 = VA / IBQ1 = 1.063V / 0.1mA = 10.63K. Drept
urmare potențialul în punctul A poate fi recalculat cosiderând că RBQ1 este în pararel cu R4.
Valoarea finală a potențialului VA este VA = VCC(R4||RBQ1)/(R6+ R4||RBQ1) = 5*265.75/1265.75 =
1.0497V.
Tensiunea aflată pe dioda laser nu poate fi calculată direct și exact deoarece nu cunoaștem
tensiunea dintre colectorul și emitorul tranzistorului Q1, iar caracteristica diodei laser diferă de la o
diodă la alta. Curentul prin diodă (12.6mA) depășește curentul de prag, astfel dioda emite un
fascicul de lumină slab.

Analiza funcționării circuitului în curent continuu cu ieșirea DAC la 0V

Acest caz apare în momentul în care driver-ul laser este alimentat și funcțional, placa FPGA
este alimentată iar ieșirea DAC-ului furnizează 0V. Circuitul ce va fi analizat este prezentat în
figura 2.12.

43
VCC
5V D5

1N4001
LED1
R1

66Ω
R6
1kΩ Q1
R2 A
2.83kΩ R4 BD139
1kΩ Q2
27%
Key=A B

2N3904
R3
31Ω

Figura 2.12 - Driver-ul laser cu ieșire DAC 0V

În acest caz am cosiderat potențiometrul R5 din figura 2.10 la valoarea 2.5K. Rezistența
R5 este în serie cu rezistența R2 = 330, așadar poate fi echivalată cu o rezistență serie de 2.83K,
notată R2 în figura 2.12.
Acest caz este similar cu cazul descris în cadrul analizei anterioare. Rezistența R4 din figura
2.11 poate fi actualizată cu valoarea R4||R2 din figura 2.12. Valoarea R4||R2 este 270 * 2830 / (270
+ 2830) = 246.5.
Reluând calculul din cazul precedent și considerând valoarea rezistenței R4 = 246.5, din
figura 2.11, obținem curentul IQ1 = 10.2mA. În acest caz se constată un curent foarte apropiat de
curentul de prag al diodei laser, iar fasciculul este puțin vizibil.

Analiza circuitului în curent continuu cu ieșirea DAC la 3V

Acest caz apare în momentul în care driver-ul laser este alimentat și funcțional, placa FPGA
este alimentată, iar ieșirea DAC-ului furnizează 3V. Circuitul ce va fi analizat este prezentat în
figura 2.13.

44
VCC
5V D5

1N4001
LED1
R1

66Ω
VDD R6
3V 1kΩ Q1
R2 A
2.83kΩ R4 BD139
1kΩ Q2
27%
Key=A B

2N3904
R3
31Ω

Figura 2.13 - Driver-ul laser cu ieșire DAC 3V

În acest caz am cosiderat condițiile analizei anterioare. Pentru calculul potențialului VA vom
folosi aceeași logică prezentată în analizele anterioare. Considerăm pentru moment curentul în baza
tranzistorului Q1 ca fiind neglijabil. Conform legii Kirchoff 1, IR4 = IR2 + IR6. De asemenea, R2IR2 +
R4IR4 = VDD și R6IR6 + R4IR4 = VCC. În cele două ecuații putem înlocui IR4 cu suma dintre IR2 și IR6
rezultând un sistem liniar cu două necunoscute. Prin rezolvarea acestui sistem se calculează IR2 =
(VDD(R4+R6)-VCCR4)/[(R2+R4)(R6+R4)-R42] = 0.636mA. După introducerea valorii IR2 în prima
ecuație, calculăm IR4 = (VDD-R2I2)/R4 = 4.438mA. Potențialul VA = R4I4 are valoarea VA = 1.198V.
Față de primele două cazuri se observă o valoare mai mare a lui VA. Putem calcula, în acest caz,
curentul prin colectorul tranzistorului Q1 ca fiind IQ1 = VB/R3 = (VA-VBEQ1)/R3 = (1.198 - 0.67)/31
= 17mA. Curentul de bază al tranzistorului Q1 este IBQ1 = IQ1 / BFQ1 = 0.017/124 = 0.137mA.
Putem calcula rezistența vazută în baza lui Q1 ca fiind RBQ1 = VA / IBQ1 = 1.198V/0.137mA =
8.744K și recalcula pe baza acestei rezistențe potențialul VA care va da valoarea 1.18V. Pe baza
acestei noi valori putem recalcula curentul de colector al tranzistorului Q1 la valoarea IQ1 = (1.18-
0.67)/31 = 16.5mA și reitera până când valoarea IQ1 nu mai scade pronunțat. Într-un final, după
simularea circuitului cu aceste valori, se obțin VA = 1.173V și IQ1 = 15.7mA.
Constatăm, în urma calculelor, că, în acest caz, curentul prin diodă este peste prag și dioda
laser emite un fascicul suficient de puternic. În tabelul 2.13 sunt sintetizate rezultatele celor trei
cazuri descrise mai sus.

45
Cazul IQ1 = Idioda laser Concluzie
Intrare dinspre 12.6mA Curentul prin laser este mic, laserul lucrează peste prag
DAC în gol
Vout DAC = 0V 10.2mA Curentul prin laser este aproape de curentul de prag,
intensitatea luminoasă emisă este mică, această stare va fi
corespunzătoare unui bit 0
Vout DAC = 3V 15.7mA Curentul prin laser este suficient de mare cât să producă o
intensitate mare a fasciculului laser care va corespunde unui
bit 1

Tabelul 2.13 - Curenții prin dioda laser în cazurile de operare posibile ale driver-ului

Protecția diodei laser în cazul supracurenților

Este deosebit de important ca dioda laser să nu fie suprasolicitată de curenți prea mari care,
în cazul cel mai fericit, îi pot reduce perioada de viață, altfel se ajunge la distrugerea permanentă a
diodei într-un timp foarte scurt. Pentru a limita curentul maxim prin diodă am introdus în circuit
tranzitorul Q2 care realizează limitarea curentului de colector al tranzitorului Q1. În figura 2.14
este prezentat circuitul de protecție.

Q1

BD139
Q2
B

2N3904
R3
31Ω

Figura 2.14 - Circuitul de protecție la supracurent

În cazul creșterii curentului prin colectorul tranzistorului Q1, pe rezistența R3 va apărea


tensiunea VR3 = R3IQ1. Dacă această tensiune ajunge la valoarea 0.66V, tranzistorul Q2 se va
deschide și va evacua sarcina în exces din baza tranzistorului Q1, fapt ce conduce la scăderea
curentului IQ1. Drept urmare, intensitatea curentului de colector al tranzistorului Q1 va avea
valoarea maximă VBEQ2/R3, comportându-se ca o sursă de curent constant, indiferent de sarcina ce
va fi injectată spre baza tranzistorului Q1. Valoarea rezistenței R3 a fost aleasă 31 pentru a obține
un curent maxim de 0.66V/31 = 21.3mA, care nu duce la distrugerea diodei laser. Tranzistorul Q2
reprezintă, în acest caz, o mică buclă de reacție negativă în circuit. Valoarea BF a tranzistorului Q2
este mare pentru a permite un curent cât mai mare prin colector și implicit o scădere rapidă a
curentului prin Q1.

46
Analiza driver-ului în cazul aplicarii unui semnal dreptunghiular la intrare

În cazul aplicării unui semnal dreptunghiular la intrarea driver-ului, circuitul va realiza


variația rapidă a curentului prin dioda laser ceea ce duce la modulația în intensitate a diodei. Dioda
lucrează în orice moment peste curentul de prag fapt ce facilitează obținerea unei modulații interne
de frecvență ridicată. Frecvența maximă a curentului prin diodă are valoarea 150KHz. Dioda poate
lucra și peste această frecvență, dar va ajunge în punctul în care variația intensității nu va mai urma
forma trenului de impulsuri dreptunghiular din pricina capacității diodei laser, care va avea tendința
de a lasa semnalul electric să treacă. Nu voi realiza analiza de curent alternativ a circuitului, ci voi
prezenta comportamentul circuitului în urma simulării în MultiSim. Pentru a realiza măsurarea
curentului prin dioda laser voi înseria cu dioda un rezistor perfect de 1. Tensiunea la bornele
rezistorului urmează precis variația curentului prin diodă. Pe un osciloscop voi urmări
comportamentul semnalului prin dioda laser, în funcție de semnalul aplicat la intrarea driver-ului. În
figura 2.15 este prezentată schema pe care se face măsurarea comportamentului circuitului.
XSC1
VCC
5V D5 Ext Trig
+
_
1N4001 A B
+ _ + _
LED1
R1 R5

66Ω 1Ω
R6
1kΩ Q1
R2 A
V1
150kHz 2.83kΩ R4 BD139
1kΩ Q2
3V 27%
Key=A B

2N3904
R3
31Ω

Figura 2.15 - Schema de măsură a comportamentului circuitului în cazul aplicării unui semnal
dreptunghiular de frecvență 150KHz și amplitudine 3Vpp

Pe intrarea A a osciloscopului este reprezentată variația tensiunii la bornele rezistorului de


1, tensiune ce are exact aceeași valoare cu a curentului prin dioda laser. La intrarea B este
reprezentată variația tensiunii aplicate la intrarea circuitului. În figura 2.16 sunt reprezentate
formele de undă obținute în urma simulării circuitului.

47
Figura 2.16 - Simularea comportamentului circuitului la aplicarea unui semnal cu amplitudinea
Vpp 3V și frecvența 150KHz

În figura 2.16, prima formă de undă reprezintă curentul prin dioda laser. Axa Y asociată
acestei reprezentări este axa din stânga. Se observă o valoare a frontului pozitiv la valoarea de
16mA și a frontului negativ la valoarea de 10mA, valori apropiate de valorile calculate. De
asemenea, a doua formă de undă reprezintă valoarea tensiunii aplicate de generator, ce are asociată
axa Y din dreapta. Valoarea pe frontul negativ este 0V și pe frontul pozitiv 3V. Curentul prin dioda
laser respectă, în linii mari, variația tensiunii de intrare. Singurele inconveniente pot apărea în
locurile în care se produc variațiile tensiunii de intrare.

Concluzii

În concluzie, am obținut un dirver laser care se încadrează în specificațiile formulate inițial.


Driver-ul poate opera laserul la curenți peste curentul de prag, indiferent de semnalul de intrare,
protejează dioda laser la supracurent și în cazul alimentării inverse. Utilitatea potențiometrelor R4 și
R5 este prezentată în capitolul 3, unde va fi dezbătută reglarea driver-ului pentru a obține un semnal
detectat corect de fotodiodă și interpretat corect de FPGA.

2.4.2 Sistemul de recepție

Sistemul de recepție este compus din fotodiodă, sarcina pe care fotodioda lucrează și ADC.
Specificațiile fotodiodei PIN sunt:
 tensiune inversă 1.3V la curent invers 80mA;
 tensiune în circuit deschis 420mV în condițiile unei puteri optice incidente 0.5mW/cm2;
 curent de scurtcircuit 100A în condițiile unei puteri optice incidente 0.5mW/cm2.

Specificațiile rezistenței de sarcină:


 rezistența cu valoare 64.

În continuare voi prezenta receptorul optic, PSF-ul și simularea receptorului optic.

48
2.4.2.1 Receptorul optic

Receptorul optic este reprezentat de cel mai simplu montaj în care poate fi exploatată o
fotodiodă, anume fotodioda lucrează în regim fotovoltaic pe o rezistență de sarcină cu valoarea R =
64. La bornele rezistenței de sarcină sunt citite valorile tensiunii ce apar în momentul în care
dioda este iluminată. Avantajul acestei abordări este reprezentat de simplitatea motanjului, fiind
necesare doar două componente discrete. Dezavantajele sunt legate, în primul rând, de operarea
fotodiodei în regim fotovoltaic, astfel răspunsul este mai lent decât în cazul operării în regim
fotoconductiv, dar zgomotul este mai redus. De asemenea, am preferat să exploatez acest regim de
operare al fotodiodei deoarece ADC-ul de pe placa de dezvoltare are treapta de cuantizare foarte
mică (15.25V). Schema receptorului este prezentată în figura 2.17.

Figura 2.17 - Schema receptorului

Analiza comportamentului fotodiodei în curent continuu

Analiza comportamentului fotodiodei nu poate fi realizată plecând de la această schemă


simplă, deoarece pe schemă nu poate fi reprezentat efectul generării optice de purtători. Pentru a
realiza o simulare a comportamentului fotodiodei în regim fotovoltaic voi folosi schema echivalentă
a fotodiodei. Circuitul rezultat în urma înlocuirii fotodiodei cu circuitul echivalent este reprezentată
în figura 2.18.

R2

1Ω

I1 D1 R3
C1 R1 64Ω
200uA DIODE_VIRTUAL 600pF 10MΩ

Figura 2.18 - Schema receptorului rezultată prin modelarea fotodiodei

Modelarea fotodiodei presupune o sursă de curent, ce injectează în circuit fotocurentul


generat optic; o diodă ideală; un condesator, ce modelează capacitatea joncțiunii; o rezistență de
șunt R1 de valoare cât mai mare și o rezistență serie R2 de valoare cât mai mică. Rezistența de
sarcină este reprezentată de R3.
Valorile alese pentru analiza circuitului sunt: R1 = 10M, R2 = 1, rezistența de sarcină R3
= 64, capacitatea joncțiunii C1 = 600pF și sursa de curent ce injectează un curent I1 = 200A.
Pentru calculul PSF considerăm curentul prin dioda D1 ca fiind 0. Condensatorul C1 se
comportă ca un gol, drept urmare curentul prin condensator este 0. În aceste condiții curentul
debitat de sursa de curent cade doar pe rezistențe. Pentru simplitatea calculelor putem considera
curentul prin R1 ca fiind 0 din cauza valorii foarte mari a rezistenței (ideal R1 trebuie să tindă la
49
infinit). Așadar, tensiunea prezentă pe gruparea serie R2+R3 este VR2+R3 = I1(R2+R3) =
200A*65 = 13mV. Cunoscând curentul în circuit putem calcula tensiunea pe rezistența de
sarcină VR3 = 200A*64 = 12.8mV. Această tensiune este suficient de mare ca să poată fi
detectată de ADC peste pragul de decizie și să fie considerată un bit cu valoarea 1. În cazul unei
intensități optice mai mici valoarea tensiunii pe rezistența de sarcină scade sub pragul de decizie și
poate fi considerată un bit cu valoarea 0. Pragul de decizie setat în FPGA este 3.89mV.

Analiza comportamentului receptorului în cazul aplicării unui semnal dreptunghiular la intrare

Putem simula recepția pe fotodiodă înlocuind sursa de curent constant cu o sursă de curent
cu o valoare mică, ce va reprezenta curentul fotogenerat în cazul recepției unui bit 0 și o sursă de
curent dreptunghiular, a carui amplitudine maximă însumată cu curentul debitat de sursa de curent
continuu va reprezenta cazul recepției unui bit 1. Schema circuitului rezultat este prezentată în
figura 2.19.
XSC1

Ext T rig
+
_
A B
+ _ + _

R4
1Ω R2

I2 1Ω
I1 150kHz R3
10uA D1 C1 R1
190uA DIODE_VIRTUAL 64Ω
600pF 10MΩ

Figura 2.19 - Schema de măsură în cazul aplicării unei intensități optice pe fotodioda simulată cu
surse de curent

Pentru a realiza măsurarea curentului de intrare am folosit o rezistență cu valoarea de 1,


tensiunea la bornele rezistenței având aceași valoare cu valoarea curentului. Semnalul pe rezistență
este captat pe canalul A al osciloscopului. Având în vedere că circuitul lucrează în curent alternativ,
condensatorul va scurtcircuita componentele de frecvență mare. Semnalul pe sarcină este captat de
osciloscop pe canalul B. Rezultatul simulării acestui circuit este prezentat în figura 2.20.

50
Figura 2.20 - Simularea receptorului în cazul aplicării unui semnal optic cu intensitate variabilă
dreptunghiular

În figura 2.20 prima formă de undă reprezintă curentul injectat. Axa Y corespunzătoare
reprezentării este axa din partea stângă. Valoarea minimă a curentului injectat este 0 și valoarea
maximă este 200A. A doua formă de undă reprezintă valoarea tensiunii rezultată pe rezistența de
sarcină. Axa Y corespunzătoare reprezentării este axa din dreapta. Valoarea minimă obținută este
aproape de 0V iar valoarea maximă este în jurul valorii de 13mV. Se observă că semnalul nu atinge
valoarea maximă imediat ce curentul injectat variază, ci prezintă "colțuri rotunjite" din cauza
curentului ce se scurge prin condensatorul C1. Citirea valorii de pe fotodiodă este realizată de ADC
după ce palierele de tensiune își stabilizează valoarea.

Concluzii

Am obținut un fotoreceptor extrem de simplu cu o fotodiodă ce lucrează în regim fotovoltaic


și o rezistență de sarcină. Rezistența a fost aleasă de valoare suficient de mică încât sarcina debitată
de fotodiodă să se scurgă repede și valoare suficient de mare încât tensiunea la borne să fie
suficientă pentru a reprezenta valorile 0 și 1 ale biților transmiși.

2.5 Schema finală a sistemului optic de transmisie - recepție

După cum se observă în figura 2.21, prezentată mai jos, semnalul sosit din DAC se propagă
prin driver-ul laser, dioda laser este modulată în intensitate, fotodioda convertește semnalul optic în
tensiune și o furnizează la intrarea ADC-ului.

51
VCC
5V
OPTIC
FD R9
LASER PHOTODIODE 64Ω ADC CH1

R1
66Ω
D5
R6
1kΩ 1N4001 Q1
R2

R5 330Ω
R4 BD139
5kΩ Q2
50% 1kΩ
Key=A 27%
DAC VoutB Key=A

2N3904
R3
31Ω

Figura 2.21 - Schema finală a sistemului de transmisie - recepție

52
Capitolul 3
Implementare și testare

Acest capitol pune accentul pe sinteza circuitului digital și implementarea fizică a circuitelor
driver laser - fotodiodă. De asemenea, sunt prezentate rezultatele testării circuitelor fizice
proiectate, precum și asamblarea lor în circuitul final. Capturile de ecran ale semnalelor redate de
sistemul de transmisie sunt realizate cu Soundcard Scope 1.32. Pentru implementare am ales placa
FPGA Xilinx Spartan 3 400 cu 400.000 de porți logice, ADC cu două canale, model Linear
Technology LTC 1865L, DAC cu două ieșiri, model Linear Technology LTC1654, oscilator local
50MHz, trei butoane, opt led-uri produsă de Nu Horizons Electronics Corporation. Componentele
discrete sunt comune, ușor de procurat din comerț și vor fi descrise în subcapitolul aferent
implementării driver-ului laser și a receptorului cu fotodiodă.

3.1 Sinteza circuitului digital

Sinteza circuitului presupune traducerea codului HDL "Verilog" al tuturor modulelor


proiectate într-un model ce descrie circuitul, care ulterior poate fi convertit într-un fișier binar ce
este scris în memoria flash a FPGA-ului.

3.1.1 Sumarul raportului de sinteză

Raportul de sinteză prezintă utilizarea resurselor plăcii. Sinteza circuitului descris mai sus
este încheiată cu succes având 0 erori și 40 de alerte. Toate alertele apărute sunt datorate blocurilor
care au ieșiri nefolosite, soft-ul de sinteză taie aceste ieșiri pentru a minimiza design-ul. Ca
utilizare, resursele sunt folosite sub 50%, în acest fel design-ul este destul de aerisit. Numărul de
flip-flop-uri folosite este de 141 din 7168(2%), iar numărul de LUT-uri cu patru intrări este de 382
din 7168 (5%). Design-ul ales nu este optimizat din punct de vedere al vitezei. În anexa 1 se
regăsește o captură de ecran cu sumarul raportului de sinteză.

3.1.2 Asignarea pinilor

Asignarea pinilor reprezintă procesul prin care fiecărui semnal din modulul de top îi este
asignată o resursă a plăcii FPGA. În proiectul acesta voi lega intrările și ieșirile din modulul de top
după cum urmează:
 semnalul reset la butonul 1;
 semnalul clk la oscilatorul local;
 semnalul cs_ld_n_dac la DAC - pinul de start conversie;
 semnalul sck_dac la DAC - pinul de ceas extern;
 semnalul sdi_dac la DAC - pinul de recepție date;
 semnalul sdi la ADC - pinul de selecție al următoarei intrări;
 semnalul ad_conv_st la ADC - semnal start conversie;
 semnalul spi_ad_sck la ADC - semnal de ceas extern;
 semnalul spi_ad_sdo la ADC - semnalul de recepție date;

53 
 semnalul leds la led-urile plăcii - în funcție de design-ul intern pot fi trimise diferite
semnale de debug către leduri.
Fișierul în care sunt descrise aceste conexiuni este reprezentat în anexa 2.

3.1.3 Verificarea și testarea circuitului digital

După realizarea sintezei și a implementării sistemului digital urmează scrierea acestuia în


placa de dezvoltare și procedura de testare. Pentru ca sistemul să poată fi testat este necesar accesul
la pinii ADC și DAC. Pe placa de dezvoltare accesul la pinii ADC-ului se face pe portul J12,
canalul CH0 este accesibil pe pinul 2, canalul CH1 pe pinul 1 și masa pe pinul 3. De asemenea,
pentru ca intrările ADC-ului să lucreze față de masă este necesară scurtcircuitarea pinilor 1 și 2 de
pe portul J13 cu un jumper, altfel intrările ADC-ului vor lucra în mod diferențial. Accesul la pinii
DAC-ului se face prin portul J10, ieșirea VoutA este disponibilă pe pinul 2, ieșirea VoutB este
disponibilă pe pinul 3 și masa pe pinul 1. Testarea se face cu cablul de programare JTAG
deconectat de pe placă. De asemenea, trebuie cunoscut faptul că ledurile plăcii lucrează în logică
negativă, sunt stinse la aplicarea unui bit 1 și aprinse la aplicarea unui bit 0.
Pentru a realiza testarea citirii corecte a unui eșantion audio pe ADC, pe ledurile plăcii de
dezvoltare poate fi aplicat semnalul audio_sample_received furnizat de modulul proces. Aplicând
între CH0 și masă o tensiune cunoscută, pe led-uri se va verifica dacă valoarea convertită
corespunde tensiunii aplicate. Trebuie menționat că semnalul audio_sample_received este pe 16 biți
iar numărul de led-uri disponibile este de opt. Se vor asigna primii 8 biți din audio_sample_received
la cele 8 leduri. De asemenea, softul trebuie rescris în placă pentru acest test.
Pentru a realiza testarea livrării corecte a eșantioanelor semnalului către driver-ul laser, se
divide ceasul global (clk) de la 20ns la 0.1 secunde. Lucrul la această viteză permite menținerea
semnalului expediat pe VoutB o perioadă suficient de mare pentru a fi observat. Citirea semnalului
de pe VoutB se poate face simplu prin conectarea ca sarcină a unui led de test (pe placa de
dezvoltare ieșirile și intrările ADC și DAC au înseriată o rezistență de 1K). Set-up-ul circuitului
rămâne în rest cel din exemplul anterior. Pe led-urile de pe placă, după terminarea citirii primului
eșantion audio, se va afla valoarea tensiuni eșantionate. Pe VoutB această valoare este expediată bit
cu bit. Se vor nota biții expediați (led de test aprins pentru 1 și stins pentru 0) și apoi se va compara
valoarea expediată serial cu cea afișată pe ledurile de pe placă. Dacă valorile corespund, circuitul
lucrează corect.
Pentru a testa dacă recepția eșantioanelor este corectă, se vor scurtcircuita pinii de masă ai
ADC-ului și ai DAC-ului. De asemenea, ieșirea VoutB a DAC-ului se va scurtcircuita cu intrarea
CH1 a ADC-ului. În soft se va seta pragul de detecție la valoarea 0111111111111 (jumătate din
valoarea de referință a ADC-ului). Semnalul digital_audio_sample_reg va fi asignat led-urilor și
ceasul va fi setat la 50MHz. La intrarea circuitului se va aplica o tensiune de valoare cunoscută.
Led-urile plăcii de dezvoltare vor trebui să afișeze valoarea tensiunii aplicate la intrare în
reprezentare binară, fără semn.
Pentru a realiza testarea integrală a sistemului digital, set-up-ul rămâne la fel ca în testul
anterior, ieșirea VoutA a DAC-ului va fi citită de un osciloscop. Pe intrarea CH0 a ADC-ului va fi
livrat un semnal de test sinusoidal de amplitudine 2Vpp și frecvență 100Hz, iar pe osciloscop: pe
canalul 1 se va citi semnalul livrat de placă și pe canalul 2 semnalul livrat de generator. Se va
constata că semnalul livrat de placă are frontul negativ al semnalului tăiat. Acest lucru se datorează
faptului că semnalul livrat de generator ia valori între -1V și 1V, iar ADC-ul citește între 0V și 3V.
Așadar, trebuie adăugată și o componentă continuă semnalului de intrare de 1V, astfel încât valorile
54 
vor fi între 0V și 2V. Pe osciloscop va fi vizualizat semnalul reconstituit pe VoutB. Se crește
amplitudinea semnalului de la generator până când semnalul de la ieșirea plăcii are valoarea
maximă (peste valoarea maximă "vârfurile" vor fi tăiate).
Dacă toate aceste teste sunt trecute cu succes, circuitul digital funcționează corect. Pragul de
detecție poate fi diminuat până la valoarea 0000000001111111 (3.89mV) și softul sintetizat poate fi
scris permanent în placă.

3.2 Realizarea driver-ului laser

La realizarea driver-ului laser am optat pentru varianta cea mai simplă, anume folosirea unei
plăci de test (solderless breadboard) pentru a nu fi nevoie de realizarea lipiturilor. Astfel, toate
componentele folosite trebuie să aibă pini / terminale suficient de lungi pentru a putea fi introduse
în perforațiile plăcii. Placa este realizată sub forma unei matrice, coloanele matricei (uzual două
secțiuni a cate șase găuri) fiind interconectate metalic. De asemenea, există și rânduri orizontale
interconectate pentru a permite, de exemplu, crearea de linii de alimentare. Pentru a permite lucrul
cu circuite integrate cu pini (de exemplu amplificatoare operaționale cu două rânduri a câte patru
pini), coloanele sunt întrerupte, permițând posibilitatea de a lucra cu fiecare pin.
Componentele discrete necesare pentru a realiza driver-ul laser sunt:
 1x laser de buzunar 650nm sau 635nm;
 2x diodă 1N4001 sau echivalent;
 1x stabilizator tensiune LM8705;
 1x tranzistor NPN BD139 sau echivalent;
 1x tranzistor 2N3904 sau echivalent;
 1x LED orice culoare, după preferință;
 1x întrerupător 2 poziții;
 1x potențiometru reglabil mono-tură 1K;
 1x potențiometru reglabil mono-tură 2.5K;
 1x potențiometru reglabil mono-tură 5K;
 1x rezistor 30 1W de precizie;
 1x rezistor 1K;
 1x condensator 220uF, 25V;
 fir cupru pentru interconectarea componentelor pe placa de test;
 baretă cu pini (recomand minim 40) pentru sudarea firelor exterioare plăcii de pini și
inserarea pinilor în perforațiile plăcii (se evită deteriorarea la transport);
 4x dioda 1N4001 pentru realizarea unei sarcini de test, vor fi scoase din circuit după
testarea inițială;
 1x rezistor 1 de precizie.

Pe lângă componentele de mai sus este nevoie și de o sursă de alimentare, obligatoriu minim
6V / 0.2A, stabilizată cât mai bine.
Schema driver-ului laser, prezentată în capitolul 2 (figura 2.10), trebuie completată cu toate
componentele care lipsesc pentru a obține schema finală ce va fi implementată pe placa de test. În
figura 3.1 este prezentată schema ce va fi implementată pe placă.

55 
6-9Vcc
VCC
6.5V J1 U1
LM7805KC D
LINE VREG
VOLTAGE
Key = A
COMMON
C1
220µF LED1 LASER

R1
66Ω
D2
D1 R7 R6 C
1N4001 2.5kΩ 50% 1kΩ 1N4001 Q1
Key=A R2

R5 330Ω A
R4 BD139
5kΩ Q2
50% 1kΩ
DAC VoutB Key=A 27%
Key=A B

2N3904
R3
31Ω

Figura 3.1 - Schema driver-ului laser prezentă pe placa de test

Rolul componentelor din figura 3.1 este următorul:


 întrerupătorul J1 oprește / pornește complet circuitul (switch ON-OFF);
 dioda D1 realizează protecția circuitului în cazul alimentării inverse. Este ideal ca acest
eveniment să nu se producă. În cazul în care sursa de alimentare nu are protecție se
ajunge la arderea elementului regulator de tensiune. Această protecție este de bază și
poate fi înlocuită cu o punte redresoare de diode care va rezolva problema alimentării
(circuitul poate fi alimentat oricum, indiferent de polaritate), dar tensiunea minimă de
alimentare va crește la 7V (uzual 1.35V se pierd pe diode);
 stabilizatorul de tensiune LM7805 realizează stabilizarea tensiunii de intrare la 5V.
Stabilizatorul este precis, dacă este alimentat la minim 5.7V. Sub această valoare,
tensiunea la ieșire poate fluctua în funcție de sarcina pe care debitează;
 condensatorul C1 realizează funcția de rezervor de energie, util în cazul variațiilor
bruște de curent la care stabilizatorul nu poate face față. Sarcina acumulată în
condensator este disponibilă la variațiile rapide ale consumului în circuit;
 gruparea LED1 - R7 realizează semnalizarea utilizatorului asupra faptului că circuitul
este sub tensiune și laserul emite. Potențiometrul R7 este util la reglarea intensității
luminii emise de led;
 dioda D2 protejează dioda laser în cazul alimentării inverse (utilă în cazul testării direct
pe placă);
 tranzistorii Q1, Q2 împreună cu rezistența R3 realizează variația și menținerea pragului
maxim de 22mA prin dioda laser. Tranzistorul Q1 este de tip NPN, modelul BD139 ce
permite un curent mare prin colector. Acesta are o arie exterioară mare ce permite
răcirea eficientă. Tranzistorul Q2 este de tip NPN, modelul 2N3904. Se pot folosi și
tranzistori echivalenți, fiind important pentru Q1 un curent mare de colector, pentru Q2
BF mare și VBE de valoare cunoscută. De asemenea, rezistența R3 trebuie să fie de
valoare fixă, de preferat ceramică, de precizie și putere 1W. În lipsa rezistenței R3 se
pot înseria două rezistențe de valoare mai mică care să respecte formula R3 =

56 
VBEQ2/IQ1max și fiecare rezistență în parte să aibă o putere proporțională cu valoarea
rezistenței;
 rezistențele R2, R6 și potențiometrele R4 și R5 realizează polarizarea tranzistorului Q1,
prin R4 se realizează reglajul brut al curentului prin dioda laser și prin R5 reglajul fin,
astfel încât variațiile intensității fasciculului laser să fie detectate corect pe fotodiodă.

În prima fază, înainte de începerea realizării circuitului este necesară o măsurare a


componentelor pentru a fi siguri de funcționarea corectă a acestora. Pentru tranzistori este indicată
verificarea, în regim de diodă, a terminalelor BE și BC. Pentru rezistențe este suficientă măsurarea
valorii acestora. Verificările se pot face cu ajutorul unui multimetru. Pentru a verifica stabilizatorul
de tensiune se aplică o tensiune de minim 6V între pinii input și common și se verifică tensiunea
dintre output și common, care va avea valoarea de 5V. După măsurarea tuturor componentelor se
poate trece la realizarea circuitului pe placa de test.
Sfaturile mele pentru realizarea circuitului sunt următoarele:
 încercați executarea circuitului de la stânga la dreapta pentru a corespunde cu schema
din figura 3.1.
 utilizați cât mai puține fire de legătură, încercați evitarea firelor de legătură folosind
găurile interconectate din coloanele plăcii de test. Aceasta facilitează economia de
spațiu;
 pentru firele de legătură externe (ideal este ca circuitul final să fie montat într-o cutie),
utilizați pinii din baretă deoarece firele se pot desprinde dacă sunt introduse direct în
perforații;
 folosind un pistol de lipit, realizați lipituri între firele externe și pinii proveniți din
baretă.

3.3 Testarea driver-ului laser

Laserul folosit în aceasta lucrare este un laser clasa IIIA cu putere maximă de 5mW, de
aceea trebuie manevrat cu atenție sporită. Nu îl îndreptați spre ochii dumneavoastră sau ai altor
persoane deoarece poate produce orbirea temporară sau defecte de vedere. Vă recomand folosirea
unor ochelari de protecție pentru a evita orice posibilă expunere a ochilor la fasciculul laser.
După realizarea circuitului pe placa de test, gruparea LASER - R1 va fi înlocuită cu o
sarcină de test formată din patru diode puse în serie și o rezistență de 1 înseriată cu gruparea de
diode. În cazul unei realizări defectuoase, dioda laser nu va avea de suferit. Circuitul va fi măsurat
de la intrare la ieșire. Pașii de testare sunt următorii:
 se alimentează corect circuitul;
 se pornește circuitul din switch-ul on-off;
 se măsoară valoarea tensiunii la intrarea stabilizatorului de tensiune;
 se măsoară valoarea tensiunii la ieșirea stabilizatorului de tensiune. Aceasta trebuie să
aibă o valoarea foarte apropiată de 5V;
 se fixează intensitatea led-ului LED1 variind potențiometrul R7 până când acesta
luminează acceptabil. Nu forțați led-ul prin varierea spre 0 a potențiometrului
deoarece se poate distruge;

57 
 Se măsoară potențialul în punctul A. Se variază R4 până când potențialul ajunge la
valoarea 0.7V. Acest potențial asigură faptul că tranzistorul Q1 este deschis, dar
curentul prin Q1 este foarte mic;
 Se măsoară tensiunea între baza și emitorul lui Q1. Se variază R4 până când tensiunea
ajunge la valoarea 0.67V. În acest moment tranzistorul Q1 este deschis și curentul curge
prin sarcina de test;
 Se măsoară tensiunea între baza și emitorul lui Q2, se variază R4 până când valoarea
ajunge la 0.66V. În acest moment circuitul lucrează la curentul maxim admis;
 Pe rezistența de 1 a sarcinii de test se măsoară tensiunea. Aceasta trebuie să fie în
jurul valorii de 20mV. Se variază R4 în sensul creșterii curentului prin Q1 și se observă
menținerea tensiunii pe rezistența de 1. De aici rezultă că protecția la supracurent
funcționează corect. Se variază R4 până când tensiunea pe rezistența de 1 ajunge la
12mV. În acest moment se poate opri circuitul, se poate scoate sarcina de test compusă
din diode și rezistența de 1 și se pune în locul lor dioda laser. Laserul ales de mine are
deja pe PCB înseriată o rezistență SMD de 66. Aceasta face parte din regulatorul de
tensiune inițial, deoarece lanterna laser din care dioda provine este alimentată cu trei
baterii de 1.5V. Am ales să păstrez în circuit această rezistență din motive de siguranță;
 Se pornește, din nou, circuitul cu dioda laser în circuit. Se conectează pinul variabil al
potențiometrului R5 la masa circuitului. Se va observa o variație a intensității luminoase
a laserului în sensul diminuării intensității;
 Se conectează pinul variabil al lui R5 la un potențial de 3V. Dacă potențialul nu este
disponibil se poate conecta chiar la linia de 5V. Se observă o variație a intensității
luminoase în sensul creșterii intensității;
 În acest moment driver-ul laser este complet funcțional.

Circuitul a fost testat pe parcursul mai multor ore, iar efectele observate au fost următoarele:
alimentat la 9V stabilizatorul de tensiune se încălzește ușor, iar la 6.5V stabilizatorul nu se
încălzește deloc. În cazul alimentării inverse a stabilizatorului de tensiune, acesta se încălzește
rapid. De asemenea, stabilizatorul se încălzește puternic și rapid în caz de scurtcircuit. Nu puneți
direct mâna pe stabilizator, nici pe tranzistoare deoarece, în cazul funcționării defectuoase, acestea
pot deveni fierbinți. La cea mai mică suspiciune că sunt probleme opriți alimentarea circuitului prin
deconectarea cablurilor de alimentare. De asemenea, evitați să lăsați circuitul să funcționeze
nesupravegheat, poate exista risc de incendiu sau ca cineva să privească în fasciculul laser.

3.4 Realizarea și testarea receptorului cu fotodiodă

La realizarea receptorului am optat pentru folosirea unei părți neutilizate din placa de test.
Receptorul este simplu, lista componentelor fiind următoarea:
 1x fotodiodă;
 1x rezistență de 64K sau orice grupare ce conține o rezistență de 64K.

Schema receptorului este aceeași cu cea prezentată în figura 2.17. Pentru a păstra coerența
lucrării voi relua această schema în figura 3.2.

58 
Figura 3.2 - Schema receptorului cu fotodiodă

Rolul componentelor din figura 3.2 este:


 fotodioda lucrează în regim fotovoltaic și stabilește la borne o tensiune ce urmează
variațiile de intensitate ale fasciculului aplicat pe suprafața activă;
 rezistența de sarcină evacuează sarcina formată pe fotodiodă, ceea ce permite creșterea
și scăderea rapidă a semnalului.

Circuitul deosebit de simplu poate fi implementat pe placa de test. Pentru a măsura


funcționarea corectă a circuitului este necesară parcurgerea următorilor pași:
 fără rezistența de sarcină, tensiunea la bornele fotodiodei se măsoară cu un multimetru.
Valoarea tensiunii trebuie să fie apropiată de 0V în cazul unei camere întunecoase.
 cu ajutorul unui laser (chiar cel prezent pe driver) se iluminează suprafața activă a
fotodiodei și se măsoară tensiunea la borne. Aceasta trebuie să fie de câțiva zeci de mV.
 se conectează și rezistența de sarcină R1 și se execută pașii anteriori. În cazul aplicării
unui spot laser puternic, tensiunea pe rezistența de sarcină trebuie să crească până la 10-
12mV.

În acest moment driver-ul laser și receptorul sunt funcționale și se poate trece la următorul
pas, anume asamblarea și testarea sistemului final.

3.5 Realizarea sistemului final

Pentru realizarea sistemului final se vor executa legăturile dintre placa de dezvoltare și
sistemele implementate pe placa de test. De asemenea, este necesară comunicarea plăcii de test cu
exteriorul. Voi parcurge în cele ce urmează legarea fiecărui canal al ADC și DAC în circuit.
Circuitul final este asamblat într-o cutie pentru a putea fi transportat, iar elementele sistemului sunt
atașate de cutie prin lipire cu termo-clei.

Legarea intrării ADC CH0 Audio

Această intrare realizează recepția eșantioanelor de semnal audio. După cum am descris în
subcapitolul 3.1.3 este necesară introducerea unei componente continue peste semnalul audio livrat
în circuit. Am realizat această funcție cu ajutorul unui divizor rezistiv de tensiune și a unui
condensator. Legarea corectă a intrării ADC CH0 este descrisă în figura 3.3.

59 
VCC
5V

R1
4.7kΩ
C1

INTRARE 47µF R2 INTRARE


AUDIO 5kΩ ADC CH0
50%
Key=A

Figura 3.3 - Adăugarea componentei continue peste semnalul audio recepționat

Componenta continuă ce se dorește a fi adăugată peste semnalul audio inițial este de 1.5V
pentru a putea acoperi toată plaja de tensiuni ce pot fi citite de ADC (0V - 3V). Componentele
necesare sunt:
 1x rezistor 4.7K;
 1x potențiometru 5K mono-tură;
 1x condensator 47F;
 1x conector audio mamă (dacă se dorește, pentru a fi mai simplă conectarea în
exterior);
 fire de legătură;
 1x conector head-er mamă pentru legătura cu pinii ADC;
 pini baretă tată pentru conectarea firelor de legătură cu exteriorul.

Se implementează și acest circuit pe placa de test într-o zonă rămasă liberă, apoi se lipesc
pinii de legătură și conectorul audio la extremitățile a două fire conectoare. Conectorul audio se
fixează pe cutie. Cu ajutorul a două fire se face conectarea cu canalul CH0 prin legarea unui fir de
masă și a celuilalt de semnal.

Legarea intrării ADC CH1 recepție eșantioane digitale

Pentru a realiza această legătură este necesară folosirea a două fire, ce se vor lega la masa și
la anodul fotodiodei cu o extremitate și cu cealaltă la masa ADC și la CH1 prin conectorul head-er,
deja montat în pasul anterior.

Legarea ieșirii DAC VoutA, expediere semnal audio reconstituit

Aceasta legătură este, de asemenea, o legătura cu exteriorul. Folosind un alt head-er mamă
se conectează două fire de legătură, unul la masă și unul la pinul aferent canalului DAC VoutA într-
o extremitate și la cealaltă un alt conector audio mamă, fixat pe cutie.

Legarea ieșirii DAC VoutB la driver-ul laser

Această legătură se realizează cu ajutorul a două fire ce unesc masa și ieșirea DAC VoutB
prin head-erul deja existent la o extremitate și masa și intrarea driver-ului la cealaltă extremitate. De
asemenea, trebuie realizate trei legături la cutie: una pentru montarea unei mufe de alimentare la
60 
driver-ul laser, a doua pentru montarea întrerupătorului și a treia pentru montarea led-ului ce
semnalează funcționarea driver-ului.
În figura 3.4 este prezentată schema finală a circuitului realizat. Driver-ul laser și fotodioda
sunt prezentate sub formă de blocuri, pentru o mai bună reprezentare în pagină.

CUITE

PLACA DE TEST

STAB TENSIUNE
6-9V ALIM 5V  PLACA FPGA 6-9V ALIM
PLACA TEST FPGA

COMPONENTA CONTINUA

CH0 CH1
ADC

DRIVER LASER
INTRARE IESIRE
AUDIO LASER VoutB VoutA AUDIO
DAC

FD

RECEPTOR FD 

Figura 3.4 - Schema finală a circuitului cu toate componentele interconectate

3.6 Testarea sistemului final

Pentru a realiza testarea sistemului final am aplicat la intrarea acestuia diferite semnale de
test și am observat ieșirea circuitului cu ajutorul unui osciloscop.
În figurile 3.5, 3.6, 3.7 sunt reprezentate semnalul de test sinusoidal, triunghiular și
dreptunghiular de frecvență redusă, aplicate la intrarea sistemului. Se observă că semnalele trec
nedistorsionate, drept urmare numărul de eșantioane este suficient pentru a reconstitui formele de
undă. În figura 3.8 este reprezentat un semnal sinusoidal de frecvență 500Hz și amplitudine mică.
Se observă că eșantioanele preluate sunt reprezentate pe puțini biți, de unde rezultă un semnal în
trepte. În figura 3.9 este prezentată o lupă peste un semnal sinusoidal de frecvență 20Hz. Se
evidențiază fiecare eșantion din forma de undă. În figura 3.10 este prezentat un semnal sinusoidal
de frecvență 2KHz. Forma de undă nu este perfectă, deoarece numărul de eșantioane preluat pentru
a reprezenta semnalul este foarte redus.

61 
Figura 3.5 - Semnal sinusoidal de frecvență Figura 3.6 - Semnal triunghiular de frecvență
50Hz 200Hz

Figura 3.7 - Semnal dreptunghiular de frecvență Figura 3.8 - Semnal sinusoidal de frecvență
500Hz 500Hz și amplitudine mică

62 
Figura 3.9 - Lupă semnal sinusoidal 20Hz.
Figura 3.10 - Semnal sinusoidal 2KHz
Treptele de tensiune la ieșirea DAC-ului sunt
vizibile

În figura 3.11 este reprezentată analiza în frecvență a unui semnal sinusoidal apropiat de
frecvența maximă ce poate fi aplicată la intrarea generatorului. În urma calculelor, frecvența
maximă a fost determinată la valoarea de 7.48KHz. Frecvența semnalului aplicat este de 7.3KHz.
Se observă două componente spectrale: prima componentă este de 7.3KHz, iar a doua componentă
este simetrică față de frecvența maximă, de frecvență mai mare și amplitudine mai mică.

Figura 3.11 - Comportamentul sistemului la frecvență apropiată de frecvența maximă

În figura 3.12 este reprezentată analiza de frecvență a unui semnal sinusoidal peste frecvența
maximă ce poate fi aplicată la intrarea generatorului. Frecvența semnalului aplicat este de 9KHz. Se
observă două componente spectrale: prima componentă este componenta semnalului subeșantionat
(6KHz), iar cea de-a doua este componenta semnalului aplicat (9KHz). De asemenea, cele două
semnale sunt simetrice față de frecvența maximă (7.48KHz). Se remarcă faptul că amplitudinea
semnalului subeșantionat este mai mare decât cea a semnalului aplicat.

63 
Figura 3.12 - Comportamentul sistemului la frecvență peste frecvența maximă

Urmărind rezultatele obținute în urma testării sistemului, sunt confirmate toate aspectele
privind proiectarea inițială. Se observă calculul corect în urma proiectării frecvenței maxime și
implicit toți timpii calculați intermediar pentru a ajunge la valoarea acestei frecvențe. De asemenea,
se observă faptul că sistemul digital se comportă mult mai bine decât un sistem analogic, referitor la
reconstituirea informației transmise. Transmisia digitală nu este influențată puternic de zgomot.
Trebuie, totuși, remarcate și dezavantajele sistemului digital: numărul de eșantioane preluate este
redus, permit doar trasmisia de voce la o calitate decentă.

64 
Concluzii

În prezenta lucrare am demonstrat posibilitatea de a realiza un sistem de transmisie a


informației utilizând o lanternă laser obișnuită, achiziționată din comerț, o fotodiodă, un număr mic
de componente discrete și o placă de dezvoltare FPGA. Trebuie menționat faptul că placa de
dezvoltare poate fi înlocuită în orice moment cu alte soluții, mai practice, de procesare a semnalului,
iar modulul de transmisie și modulul de recepție pot funcționa independent, ceea ce duce la
obținerea unei distanțe mari între cele două dispozitive, implicit la folosirea acestui sistem pentru a
realiza o comunicație utilă. În acest studiu am vrut să demonstrez posibilitatea de realizare și
implementare a unei aplicații practice. Având în vedere că sincronizarea semnalului emis și a celui
recepționat se fac prin intermediul ceasului plăcii FPGA și viteza de transmisie este mică, utilitatea
lucrării este doar didactică. În cazul în care ar fi implementate emițătorul și receptorul independent
și la distanță, este nevoie de sincronizarea transmisei, ceea ce duce la implementarea unui protocol
serial veritabil (similar standardului RS232). De asemenea, în cazul transmiterii de date la distanță
este necesară ajustarea automată a pragului de detecție. Se poate realiza destul de ușor reglajul
automat al pragului. Acesta este posibil dacă, periodic, sunt emise semnale de sincronizare pentru
prag, prin menținerea pentru o perioadă de timp a laserului la intensitatea ce corespunde ca valoare
bitului 1, apoi reducem intensitatea până la valoarea corespunzătoare bitului 0, urmând ca pe baza
tensiunilor rezultate în ambele situații să se facă calculul pragului.
Aplicațiile unui sistem de transmisie digital, prin laser, în mediu aer sunt diverse: se poate
realiza, de exemplu, implementarea unui sistem de sonorizare într-o clădire mare fără a folosi
cabluri (acestea sunt înlocuite de fascicule laser prin care este trimis un flux audio codat digital); o
altă aplicație utilă este cheia laser. Un flux digital poate fi expediat prin laser, captat pe o fotodiodă
și decodat. Biții transmiși pot forma o cheie care, după validare declanșează deschiderea unei uși.
Avantajul, în această situație, este dat de faptul că informația este transmisă optic de la mică
distanță. Posibilitatea de a reproduce semnalul expediat, implicit cheia digitală, este practic nulă
atâta timp cât cheia laser nu intră în posesia altei persoane. O altă aplicație a acestui sistem este
reprezentată de comunicațiile de voce între diferite puncte geografice la medie și mare distanță. Prin
intermediul modulației analogice s-a realizat, cu succes, transmisia de voce, prin mediu aer, la sute
de kilometri distanță. În schimb, informația expediată în format digital este mai bună, din punct de
vedere calitativ, dar nu poate fi transmisă la distanțe mai mari de câțiva kilometri. Un avantaj al
transmisiei informației prin intermediul luminii, în mediu aer este reprezentat de logistica redusă a
sistemului de transmisie (lipsa cablurilor).
Problemele apărute la realizare au fost reprezentate de implementarea soft-ului înscris în
placa FPGA, în special din cauza modului de lucru dificil cu ADC-ul și DAC-ul disponibile pe
placa de dezvoltare. De asemenea, am întâmpinat dificultăți la alegerea unor timpi suficient de mari
pentru a premite sincronizarea tuturor componentelor din sistem și suficient de mici pentru o viteză
bună de transmisie a informației, implicit la realizarea aplicației audio. În cazul realizării driver-ului
laser problemele au fost reprezentate de lipiturile efectuate (în construcția sistemului am realizat
lipituri de finețe) și acordarea unei atenții sporite lucrului cu componentele discrete (menționez că
am ars două diode laser până să obțin o funcționare corectă, drept urmare nu recomand
implementarea proiectului direct cu o diodă laser în sistem, ci utilizarea unei sarcini de test ca cea
descrisă în lucrare).

65 
Costurile de realizare sunt ridicate, majoritatea resurselor le-am alocat plăcii de dezvoltare
FPGA, aproximativ 900 de lei. Costurile de realizare ale driver-ului laser și ale receptorului cu
fotodiodă sunt relativ mici. Laserul este disponibil în comerț la prețul de aproximativ 5 lei,
fotodioda tot în jur de 5 lei, tranzistoarele, condensatoarele și rezistențele folosite valorează în jur
de 10 lei, stabilizatorul de tensiune, switch-ul on / off, mufele și bareta de pini costă aproximativ 15
lei, iar placa de test 50 de lei. Astfel am alocat 90-100 de lei pentru sistemul de transmisie cu laser
și receptorul cu fotodiodă. Costul total este ridicat datorită FPGA-ului, dar implementarea digitală
se poate face cu orice sistem de prelucrare suficient de rapid (de exemplu PIC, care are costuri mai
reduse).
În concluzie am demonstrat că utilizând o lanternă laser obișnuită și o fotodiodă se poate
realiza un sistem de comunicație digital cu aplicații diverse și utile.

66 
Bibliografie

[1] Laseri, aplicații în medicină, Notițe de curs, Iasi, 2004, pagina 45, subcapitolul 4.3
http://www.scribd.com/doc/85858437/22/Laserul-cu-semiconductori, accesat la data 27 Iulie 2012

[2] Proiect de licență, Regulator pentru controlul intensității luminoase într-o incintă,
Facultatea de Stat din Pitești, Facultatea de Electronica, Comunicații și Calculatoare, Pitești, 2009,
pagina 27, subcapitolul 1.3.4, http://www.scribd.com/doc/77886273/6/Fotodioda, accesat la data 27
Iulie 2012

[3] Lucrare de licență, Generator de semnal de audiofrecvență implementat cu FPGA, UPB,


Facultatea de Electronica, Telecomunicații și Tehnologia Informației, A. Ghinea, București, 2010

[4] Hascsi, Z., Stoian, M., Soeanu, A., Arhitectura Procesoarelor, Editura Fair Parteners,
Bucuresti, 2003

[5] Ștefan, G., Circuite integrate digitale, Editura Denix, 1994

[6] Pong P., C., FPGA prototyping by Verilog examples, Editura Wiley , Hoboken, New Jersey,
USA, 2008

[7] http://arh.pub.ro/html/cid1.html, accesat la data 27 Iulie 2012

67 
68 
Anexa 1 - Sumarul raportului de sinteză

69
 
Anexa 2 - Asignarea pinilor în FPGA

pins.ucf

NET "leds<0>" LOC = P161;


NET "leds<1>" LOC = P162;
NET "leds<2>" LOC = P165;
NET "leds<3>" LOC = P166;
NET "leds<4>" LOC = P167;
NET "leds<5>" LOC = P168;
NET "leds<6>" LOC = P169;
NET "leds<7>" LOC = P171;

NET "clk" LOC= P79;


NET "reset" LOC = P77;

NET "spi_ad_sdo" LOC= P68;


net "spi_ad_sck" LOC= P67;
net "ad_conv_st" LOC= P72;
net "sdi" LOC=P71;

net "CS_LD_n_dac" LOC = P63;


net "SDI_dac" LOC = P64;
net "SCK_dac" LOC = P65;

70
 
Anexa 3 - Codul sursă Verilog

clk_divider_dac.v

module clk_divider_dac(input clk, input reset, output reg div_clk);

reg [2:0] num;

always @(posedge clk or posedge reset) begin


if(reset) begin
num <=0;
div_clk <=0;
end
else
if(num == 1) begin
div_clk <= ~div_clk;
num <= 0;
end else
begin
num <= num + 1;
end
end
endmodule

clk_divider_adc.v

module clk_divider_adc(input clk, input reset, output reg div_clk);

reg [2:0] num;

always @(posedge clk or posedge reset) begin


if(reset) begin
num <=0;
div_clk <=0;
end
else
if(num == 2) begin
div_clk <= ~div_clk;
num <= 0;
end else
begin
num <= num + 1;
end
end

71
 
endmodule

adc.v

module adc(input reset, input clk_adc, input adc_start, input


spi_ad_sdo,
output spi_ad_sck, output reg ad_conv_st, output reg sdi,
output reg [15:0] signal,
output reg done, output reg state, output reg [4:0]
sample_counter);

reg [7:0]count;//da numarul ciclului la citirea adc


reg [4:0]count_adc_bits;//da numarul de ordine al bitului primit din
adc
reg [15:0]signal_received;//semnalul receptionat
//reg [4:0]sample_counter;//numara esantioanele primite, da numarul
esantionului curent
reg ch;
reg working;

assign spi_ad_sck = ~clk_adc;//ceasul adc-ului

always @(posedge reset or posedge clk_adc) begin


if(reset) begin
state <= 0;
signal_received <= 0;
ad_conv_st <= 1;
count <= 0;
count_adc_bits <= 0;
sdi<= 0;
done <=0;
ch <= 1;//read ch 1
sample_counter <= 0;
working <= 0;
end
else begin
if(adc_start == 1 || working == 1) begin

case (ch)
0: begin
//citeste un esantion de pe CH0
case(state)
0: begin//t conv...

72
 
working<= 1;
count_adc_bits <= 0;
done <= 0;
if(count == 0) begin
signal <= signal_received;
count <= count + 1;
ad_conv_st <= 1;
end else
if(count == 27) begin
count <= 0;
state <= 1;
sdi <= 1;
ad_conv_st <= 0;
end
else begin
ad_conv_st <= 1;
count <= count+1;
signal_received <= 0;
end
end

1: begin// tsample + read adc


sdi <= 0;
signal_received[15-count_adc_bits]
<= spi_ad_sdo;
if(count_adc_bits == 15) begin
state <= 0;
working <= 0;
done <= 1;
ad_conv_st <= 1;
count<=0 ;
ch<=1;
sample_counter <= 1;
end
else begin
working<= 1;
ad_conv_st <= 0;
count_adc_bits <=
count_adc_bits + 1;

if(count_adc_bits ==
0)begin//next read is for sure from CH1!
sdi <= 1;
end
else begin

73
 
sdi <= 0;
end
end
end
endcase// end case read ch0
end
1: begin
//citeste un esantion pe CH1
case(state)
0: begin//t conv...
working<= 1;
count_adc_bits <= 0;
done <= 0;
if(count == 0) begin
signal <= signal_received;
count <= count + 1;
ad_conv_st <= 1;
end else
if(count == 40) begin
count <= 0;
state <= 1;
sdi <= 1;
ad_conv_st <= 0;
end
else begin
ad_conv_st <= 1;
count <= count+1;
signal_received <= 0;
end
end
1: begin
sdi <= 0;
signal_received[15-count_adc_bits]
<= spi_ad_sdo;
if(count_adc_bits == 15) begin
state <= 0;
working <= 0;
done <= 1;
ad_conv_st <= 1;
count<=0 ;
if(sample_counter ==
9)begin//swtich channel
ch <= 0;
sample_counter <= 0;
end else

74
 
begin
sample_counter <=
sample_counter+1;
end
end
else begin
working<= 1;
ad_conv_st <= 0;
count_adc_bits <=
count_adc_bits + 1;

if(sample_counter ==
8)begin//next read will be ch0 if last sample from ch1
sdi <= 0;
end
else begin//read ch2, continue
if(count_adc_bits ==
0)begin
sdi <= 1;
end
else begin
sdi <= 0;
end

end
end
end
endcase// end case read ch1
end
endcase //end case ch switcher

end

end//end if working or start


end

endmodule

top_dac.v

module dac(input reset, input clk, input ch, input dac_start, input
[12:0] signal,
output SCK_dac, output reg CS_LD_n_dac,
output reg SDI_dac, output reg done);

75
 
reg [23:0] data_to_dac;
reg [4:0]count;
reg working;
reg read_sample_create_output_signal;

assign SCK_dac = (count == 0)? 0: ~clk;

always @(posedge clk or posedge reset) begin


if(reset) begin
CS_LD_n_dac <=1;
SDI_dac <= 0;
data_to_dac <= {4'b0101, 4'b0000, signal, 3'b0};
//init signal
count <=0;
working <= 0;
read_sample_create_output_signal <= 0;
end
else begin
if(dac_start == 1 || working == 1) begin
if(read_sample_create_output_signal == 0) begin
if(ch == 0) begin
data_to_dac <= {4'b0011, 4'b0000, signal, 3'b0};
end else
begin
data_to_dac <= {4'b0011, 4'b0001, signal, 3'b0};
end
read_sample_create_output_signal <= 1;
end else begin
working <= 1;
CS_LD_n_dac <= 0;
SDI_dac <= data_to_dac[23];
data_to_dac<= data_to_dac<<1;
if(count == 23)begin
done <= 1;
end
else begin
done <= 0;
end

if(count == 24) begin


working <= 0;
CS_LD_n_dac <= 1;
count<=0;
read_sample_create_output_signal <= 0;

76
 
end else
begin
count <= count+1;
CS_LD_n_dac <= 0;
end

end

end//end read_sample_create_output_signal

end
end

endmodule

process.v

module process(input reset, input clk, input [15:0]adc_sgn,


input [4:0]adc_sample_counter,
input dac_done,
input adc_done, output reg [12:0] dac_sgn, output
reg dac_ch, output reg dac_start,
output reg adc_start, output reg [7:0]
digital_audio_sample_reg, output reg [15:0]
audio_sample_received,
output reg [3:0] process_state, output
reg [7:0]last_output_audio_dac);

//reg [15:0] audio_sample_received;//aici primesc un semnal de


la ADC
//reg [7:0] digital_audio_sample_reg; //aici reconstitui
semnalul digital care va pleca pe DAC
reg [3:0] bit_counter;

//reg [3:0]process_state; //0 read adc audio ch0, write dac


audio ch0
//1 wait adc, write dac audio ch1 bit1
//2 read adc bit1, write dac bit2... etc
//3 read adc bit8, dac idle

reg dac_written;
reg audio_bit_shifted;

77
 
always@(posedge clk or posedge reset) begin
if(reset) begin
dac_sgn <= 12'b0;
dac_ch <= 0;
bit_counter <= 0;
dac_sgn <= 0;
audio_sample_received <= 0;
digital_audio_sample_reg <= 0;
bit_counter <= 0;
dac_start <= 0;//dac idle
adc_start <= 0;//adc working
process_state <= 0;
dac_written <= 0;
audio_bit_shifted <= 0;
last_output_audio_dac <= 0;
end else
begin
case (process_state)
0: begin
adc_start<=1; //start DAC SAMPLING
dac_ch <=0 ;
//read first sample of the ADC
if(adc_done == 1 && adc_sample_counter ==
1)begin //am citit un esantion de pe CH0
//salvez esantionul audio
audio_sample_received[15:8] <= adc_sgn[15:8];
bit_counter <= 0;
dac_ch <= 1;//urmatorul esantion pe DAC este
digital
process_state <= 1;
bit_counter <= 0;//no bits received until now
dac_written <= 0;
adc_start<= 0;
digital_audio_sample_reg <= 0;
end

if(dac_written == 0) begin
//write audio sample to DAC
dac_start <= 1;

78
 
dac_sgn <= {digital_audio_sample_reg[6:0], 6'b0};
last_output_audio_dac <=
digital_audio_sample_reg;
dac_written <= 1;
end

if(dac_written == 1 && dac_done == 1) begin


dac_start <= 0;
end

end//end process state case 0

1: begin
//read bit 1 adc, write bit 2 dac....
adc_start <= 1;
if(adc_done == 1 && adc_sample_counter == 2) begin
dac_written <= 0;
process_state <= 2;
audio_bit_shifted <= 0;
end

if(dac_written == 0 && dac_done == 0) begin


//write next bit to DAC
if(audio_sample_received[15] == 1) begin
dac_sgn <= 13'b1111111111111;
end else begin
dac_sgn <= 13'b0;
end
dac_written <= 1;
dac_start <=1; //write sample to dac

if(audio_bit_shifted == 0)begin
audio_sample_received <= audio_sample_received
<< 1; //shift audio sample
audio_bit_shifted <= 1;
end

end//end dac written

if(dac_written == 1 && dac_done == 1) begin

79
 
dac_start <= 0;
end
end//end process state case 2

2: begin
//read bit 1 adc, write bit 2 dac....
adc_start <= 1;
if(adc_done == 1 && adc_sample_counter == 3) begin
//bit arrived
if(adc_sgn < 16'b0000000001111111) begin
digital_audio_sample_reg[7-bit_counter] <=
0;
end else
begin
digital_audio_sample_reg[7-bit_counter] <=
1;
end
bit_counter <= bit_counter + 1;
dac_written <= 0;
process_state <= 3;
audio_bit_shifted <= 0;
end

if(dac_written == 0 && dac_done == 0) begin


//write next bit to DAC
if(audio_sample_received[15] == 1) begin
dac_sgn <= 13'b1111111111111;
end else begin
dac_sgn <= 13'b0;
end
dac_written <= 1;
dac_start <=1; //write sample to dac

if(audio_bit_shifted == 0)begin
audio_sample_received <= audio_sample_received
<< 1; //shift audio sample
audio_bit_shifted <= 1;
end

80
 
end//end dac written

if(dac_written == 1 && dac_done == 1) begin


dac_start <= 0;
end
end//end process state case 2

3: begin
//read bit 1 adc, write bit 2 dac....
adc_start <= 1;
if(adc_done == 1 && adc_sample_counter == 4) begin
//bit arrived
if(adc_sgn < 16'b0000000001111111) begin
digital_audio_sample_reg[7-bit_counter] <=
0;
end else
begin
digital_audio_sample_reg[7-bit_counter] <=
1;
end
bit_counter <= bit_counter + 1;
dac_written <= 0;
process_state <= 4;
audio_bit_shifted <= 0;
end

if(dac_written == 0 && dac_done == 0) begin


//write next bit to DAC
if(audio_sample_received[15] == 1) begin
dac_sgn <= 13'b1111111111111;
end else begin
dac_sgn <= 13'b0;
end
dac_written <= 1;
dac_start <=1; //write sample to dac
if(audio_bit_shifted == 0)begin
audio_sample_received <= audio_sample_received
<< 1; //shift audio sample
audio_bit_shifted <= 1;
end

81
 
end//end dac written

if(dac_written == 1 && dac_done == 1) begin


dac_start <= 0;
end
end//end process state case 3

4: begin
//read bit 1 adc, write bit 2 dac....
adc_start <= 1;
if(adc_done == 1 && adc_sample_counter == 5) begin
//bit arrived
if(adc_sgn < 16'b0000000001111111) begin
digital_audio_sample_reg[7-bit_counter] <=
0;
end else
begin
digital_audio_sample_reg[7-bit_counter] <=
1;
end
bit_counter <= bit_counter + 1;
dac_written <= 0;
process_state <= 5;
audio_bit_shifted <= 0;
end

if(dac_written == 0 && dac_done == 0) begin


//write next bit to DAC
if(audio_sample_received[15] == 1) begin
dac_sgn <= 13'b1111111111111;
end else begin
dac_sgn <= 13'b0;
end
dac_written <= 1;
dac_start <=1; //write sample to dac
if(audio_bit_shifted == 0)begin
audio_sample_received <= audio_sample_received
<< 1; //shift audio sample
audio_bit_shifted <= 1;
end

82
 
end//end dac written

if(dac_written == 1 && dac_done == 1) begin


dac_start <= 0;
end
end//end process state case 4

5: begin
//read bit 1 adc, write bit 2 dac....
adc_start <= 1;
if(adc_done == 1 && adc_sample_counter == 6) begin
//bit arrived
if(adc_sgn < 16'b0000000001111111) begin
digital_audio_sample_reg[7-bit_counter] <=
0;
end else
begin
digital_audio_sample_reg[7-bit_counter] <=
1;
end
bit_counter <= bit_counter + 1;
dac_written <= 0;
process_state <= 6;
audio_bit_shifted <= 0;
end

if(dac_written == 0 && dac_done == 0) begin


//write next bit to DAC
if(audio_sample_received[15] == 1) begin
dac_sgn <= 13'b1111111111111;
end else begin
dac_sgn <= 13'b0;
end
dac_written <= 1;
dac_start <=1; //write sample to dac
if(audio_bit_shifted == 0)begin
audio_sample_received <= audio_sample_received
<< 1; //shift audio sample
audio_bit_shifted <= 1;
end
end//end dac written

83
 
if(dac_written == 1 && dac_done == 1) begin
dac_start <= 0;
end
end//end process state case 5

6: begin
//read bit 1 adc, write bit 2 dac....
adc_start <= 1;
if(adc_done == 1 && adc_sample_counter == 7) begin
//bit arrived
if(adc_sgn < 16'b0000000001111111) begin
digital_audio_sample_reg[7-bit_counter] <=
0;
end else
begin
digital_audio_sample_reg[7-bit_counter] <=
1;
end
bit_counter <= bit_counter + 1;
dac_written <= 0;
process_state <= 7;
audio_bit_shifted <= 0;
end

if(dac_written == 0 && dac_done == 0) begin


//write next bit to DAC
if(audio_sample_received[15] == 1) begin
dac_sgn <= 13'b1111111111111;
end else begin
dac_sgn <= 13'b0;
end
dac_written <= 1;
dac_start <=1; //write sample to dac
if(audio_bit_shifted == 0)begin
audio_sample_received <= audio_sample_received
<< 1; //shift audio sample
audio_bit_shifted <= 1;
end
end//end dac written

84
 
if(dac_written == 1 && dac_done == 1) begin
dac_start <= 0;
end
end//end process state case 6

7: begin
//read bit 1 adc, write bit 2 dac....
adc_start <= 1;
if(adc_done == 1 && adc_sample_counter == 8) begin
//bit arrived
if(adc_sgn < 16'b0000000001111111) begin
digital_audio_sample_reg[7-bit_counter] <=
0;
end else
begin
digital_audio_sample_reg[7-bit_counter] <=
1;
end
bit_counter <= bit_counter + 1;
dac_written <= 0;
process_state <= 8;
audio_bit_shifted <=0;
end

if(dac_written == 0 && dac_done == 0) begin


//write next bit to DAC
if(audio_sample_received[15] == 1) begin
dac_sgn <= 13'b1111111111111;
end else begin
dac_sgn <= 13'b0;
end
dac_written <= 1;
dac_start <=1; //write sample to dac
if(audio_bit_shifted == 0)begin
audio_sample_received <= audio_sample_received
<< 1; //shift audio sample
audio_bit_shifted <= 1;
end
end//end dac written

if(dac_written == 1 && dac_done == 1) begin

85
 
dac_start <= 0;
end
end//end process state case 4

8: begin
//read bit 1 adc, write bit 2 dac....
adc_start <= 1;
if(adc_done == 1 && adc_sample_counter == 9) begin
//bit arrived
if(adc_sgn < 16'b0000000001111111) begin
digital_audio_sample_reg[7-bit_counter] <=
0;
end else
begin
digital_audio_sample_reg[7-bit_counter] <=
1;
end
bit_counter <= bit_counter + 1;
dac_written <= 0;
process_state <= 9;
audio_bit_shifted <= 0;
end

if(dac_written == 0 && dac_done == 0) begin


//write next bit to DAC
if(audio_sample_received[15] == 1) begin
dac_sgn <= 13'b1111111111111;
end else begin
dac_sgn <= 13'b0;
end
dac_written <= 1;
dac_start <=1; //write sample to dac
if(audio_bit_shifted == 0)begin
audio_sample_received <= audio_sample_received
<< 1; //shift audio sample
audio_bit_shifted <= 1;
end
end//end dac written

if(dac_written == 1 && dac_done == 1) begin


dac_start <= 0;

86
 
end
end//end process state case 4

9: begin
//read last adc bit, dac stays idle
adc_start <= 1;
if(adc_done == 1 && adc_sample_counter == 0) begin
//bit arrived
if(adc_sgn < 16'b0000000001111111) begin
digital_audio_sample_reg[7-bit_counter] <=
0;
end else
begin
digital_audio_sample_reg[7-bit_counter] <=
1;
end
bit_counter <= 0;
process_state <= 0; //go back to state 1,
cycle is over!
adc_start <= 0;
dac_written <= 0;
end

end
endcase
end
end //end always

endmodule

top_adc.v

module top_adc(input reset, input clk, input spi_ad_sdo, output


spi_ad_sck,
output ad_conv_st, output sdi, output CS_LD_n_dac,
output SDI_dac, output SCK_dac, output [7:0]leds);

wire dac_clk;
wire div_clk;
wire [15:0]adc_signal;
wire adc_done;
wire state;

87
 
wire [4:0] adc_sample_counter;
wire [12:0]dac_sgn;
wire dac_ch;
wire dac_done;
wire dac_start;
wire adc_start;
wire clk_div_all;
wire [7:0] digital_audio_sample_reg;
wire [15:0] audio_sample_received;
wire [3:0] process_state;
wire [7:0]last_output_audio_dac;

//assign leds = last_output_audio_dac;

//assign leds[7] = ad_conv_st;


assign leds[7:0] = adc_signal[15:8];

//assign leds[0] = dac_ch;


//assign leds[7:1] = digital_audio_sample_reg[7:1];

//assign leds[3:1] = dac_sgn[12:9];


//assign leds[7:4] = adc_signal[15:12];
//assign leds[0] = dac_ch;

//assign leds[5:0] = dac_sgn[12:6];


//assign leds[6] = dac_ch;
//assign leds[7] = clk;

//assign leds[0] = done;


//assign leds[1] = ad_conv_st;
//assign leds[2] = sdi;
//assign leds[3] = spi_ad_sdo;
//assign leds[4] = state;
//assign leds[5] = ch;
//assign leds[6] = spi_ad_sck;
//assign leds[7] = div_clk;

//clk_div_all clk_div_all1(.clk(clk), .reset(~reset),


.div_clk(clk_div_all));

clk_divider_dac dac_clk_m(.clk(clk), .reset(~reset),


.div_clk(dac_clk));
clk_divider_adc clk_divider_adc(.clk(clk), .reset(~reset),
.div_clk(div_clk));

88
 
adc adc(.reset(~reset), .clk_adc(div_clk), .adc_start(adc_start),
.spi_ad_sdo(spi_ad_sdo),
.spi_ad_sck(spi_ad_sck),
.ad_conv_st(ad_conv_st), .sdi(sdi), .signal(adc_signal),
.done(adc_done), .state(state),
.sample_counter(adc_sample_counter));

dac dac(.reset(~reset), .clk(dac_clk), .ch(dac_ch),


.dac_start(dac_start),
.signal(dac_sgn), .SCK_dac(SCK_dac),
.CS_LD_n_dac(CS_LD_n_dac), .SDI_dac(SDI_dac),
.done(dac_done));

process process(.reset(~reset), .clk(clk), .adc_sgn(adc_signal),


.adc_sample_counter(adc_sample_counter),
.adc_done(adc_done),
.dac_done(dac_done),
.dac_sgn(dac_sgn),
.dac_ch(dac_ch), .dac_start(dac_start),
.adc_start(adc_start),
.digital_audio_sample_reg(digital_audio_sample_reg),

.audio_sample_received(audio_sample_received),
.process_state(process_state),

.last_output_audio_dac(last_output_audio_dac)
);

/*
wire div_clk;
wire [15:0]signal_ch0;
wire [15:0]signal_ch1;
wire dac_clk;
wire adc_done;//nelegat, vine din adc
wire state;//nelegat, vine din adc
wire ch;//fir ch, canalul pe care fac switch
wire dac_done;

assign leds[7:0] = signal_ch0[15:8];


//assign leds[3:0] = signal_ch1[15:12];

//assign leds[0] = ~reset;

89
 
//assign leds[7:1] = signal[15:9];

//assign leds[0] = done;


//assign leds[1] = ad_conv_st;
//assign leds[2] = sdi;
//assign leds[3] = spi_ad_sdo;
//assign leds[4] = state;
//assign leds[5] = ch;
//assign leds[6] = spi_ad_sck;
//assign leds[7] = div_clk;

//assign leds[7:2] = signal[15:10];


//assign leds[1] = spi_ad_sdo;
//assign leds[0] = done;

clk_divider_adc clk_divider_adc(.clk(clk), .reset(~reset),


.div_clk(div_clk));

adc adc(.reset(~reset), .clk_adc(div_clk), .spi_ad_sdo(spi_ad_sdo),


.spi_ad_sck(spi_ad_sck),
.ad_conv_st(ad_conv_st), .sdi(sdi), .signal_ch0(signal_ch0),
.signal_ch1(signal_ch1), .done(adc_done), .state(state), .ch(ch));

top_dac dac(.reset(~reset), .clk(dac_clk), .ch(ch),


.signal({signal_ch0[15:8],5'b0}), .SCK_dac(SCK_dac),
.CS_LD_n_dac(CS_LD_n_dac), .SDI_dac(SDI_dac),
.done(dac_done));

clk_divider_dac dac_clk_m(.clk(clk), .reset(~reset),


.div_clk(dac_clk));
*/
endmodule

90