# FPGA, CPLD, 74xx loģikas >  Taisam ADC ar DAC un V-COMP uz AVR un FPGA

## Epis

Pagaidām esu uztaisījis  ADC uz atmegas8 izmantojot iekšējo Comparātoru un Rezistoru 5 bitu DAC ( resistor R/2R ladder) 
Darbības prncips ir līdzīgs SAR (Successive-approximation-register) 
šeit SAR ADC labs praksta links http://www.maxim-ic.com/appnotes.cfm/an_pk/1080


Un pēdējā bildē var redzēt kad analogo singālu meklē izmantojot comparātoru un pieregulējot DAC konvertiera vērtību (pa bitiem (sākot no MSB līdz LSB) un kad tiek līdz LSB tad arī uzskata kad process ir pabeigts, es savā variantā neizmantoju sample/hold loģiku bet uzreiz grūdu signālu iekš Comparātoraa un ar DAC pārveidotāja pēdējo bitu meklēju analogo singālu (jo mans signāls bija sīnus ar samērā zemu frekvenci 350hz bez lieliem trokšņiem un tādā ātrumā analogā vērtība mainās lēnu līdz ar to signālam sekot varēja ar DAC pēdējiem LSB(last significant bit) bitu
un šeit bilde kur var redzēt kā atmega8 meklē analogo signālu

šeit visas plates bilde + fotopārtraucējs kurš ģenerē to sīnusa vilņi ratam griežoties un tad iet atmega 8
[attachment=0:2c531]FT-mega8-Disks-bilde-cut.JPG[/attachment:2c531]
šeit es izmēģināju cik tad ātri iet Atmegas8 ADC, pēc dokumenta ar 10bit izšķirtspēju ātrums ir 15.3Ksps un normāli ar zemāku izšķirtspēju var laist līdz 75Ksps, un tad es uzliku megai8 16Mhz pūlksteni un sāku pazemināt ADC prescalera vērtību un kad aizgāju līdz vērtībai 2 tad ADC varirāk negāja (neģenerēja pārtraukuma vektoru!) un tad šeit ir ar /4 prescaleri bilde kā strādā ADC. viņa darbību var redzēt 5bitu DAC rādījumos (DAC atēlo sīnusa vilni (viņš ir tuvs oriģinālajam vilnim) bet es ar savu oscilu īsti nevaru noteikt cik precīzi Atmegas 8 ADC gāja (moš tā precizitāte bija tikai 4 biti (un 5 bits svārstījās to Oscilā redzēt īsti nevar) bet fakts kad ADC max ir pie 307Ksps   ::  (15Ksps vietā), bet stabilāk ADC noteikti ietu ar 150ksps (tas tad varētu būt stabila 5bitu izšķirtspēja) 
un tākā man 150Ksps ir pa maz  ::  (jo man būs 2 fotopārtraucējiem sīnusa vilnis jāapstrādā tad uz 1 sanāk 75ksps (pamaz) tad izdomāju kad jāpamēģina uztaisīt šitas ADC uz fpga (tāds salīdzinājums starp AVR un FPGA loģikas super jaudu  ::  un priekš Fpga es jau atradu 300ns L339 4X Comparātori vienā pakā par 20 saņiem  ::  (lētāk nekā Opampi) un, protams vaidzēs rezistorus (priekš fpga es ņemšu SMD mazos (tie ir precīzāki un lētāki ap 1sani) tākā šitas fpga adc konvertieris izmanksās zem 50 saņiem  (ja neskaita pašu fpga mikreni) vienīgi būs grūti pārbaudīt ADC precizitāti jo man oscils velk tikai līdz 1Msps  ::  
[attachment=1:2c531]atmega 307khz-sin-decoder.JPG[/attachment:2c531]
un šeit Atmega8 divi kodi kurus izmantoju testesta programmās pirmais ir Comparātora kods (šitas variants ir lēnais kur par 150-75Ksps ātāk neiet lai dabūtu visus 500ksps ir jāizņem Loop pēdējā daļa (kas domā priekš sin enkodera ja to izņem tad kods skrien uz max iespējamo ātrumu.


```
#include "m8def.inc"
	rjmp reset 
.org $010
	rjmp ANA_COMP

reset: ; the reset code:
; stack setup; set SPH:SPL to
; RAMEND
	ldi r16, low(RAMEND)
	out SPL, r16
	ldi r16, high(RAMEND)
	out SPH, r16

	ldi r16, 0b00000110 ; Test PB1 pins 
	out DDRB, R16
	ldi r16, 0b00000110	; 
	out PORTB, r16		

	ldi r16, 0b00011111 ; uzliekam PC4-PC0 pinus kā OUtput :)
	out DDRC, R16
	ldi r16, 0b00000001	; uzliekam PC0=1 DAC=2,5V :)
	out PORTC, r16
	
	ldi r16, (1<<ACIE)|(0<<ACIS1)|(0<<ACIS0)
	out ACSR, r16		; uzliek ACIE, un ACIS0;1 bitus 
	sei
.def viens=R0 ; vieninieka reģistrs
.def DAC=R1  ; DAC reģistrs
.def OldDAC=R9 ; DAC vecā vērtiba ar kuru varēs salīdizināt vai ir pāgājis enkodera solis
.def TLparbaude=R2 ; Taimera1 LO bits
.def THparbaude=R3 ; taimera1 HI bits
.def TLjaunais=R4; taimer0 LO jaunais
.def THjaunais=r5; taimer0 HI jaunais
.def Htaimer=R6 ; 8bit taimera Hi bits
.def Nulle=R7 ; nules bits
.def MAX=R8 ; DAC-MAX 31 bits

	sbr r19,1 ; parbaude
	ldi r16,16
	mov DAC,r16 ; DAC reģistrs
	ldi R16,31
	mov MAX,R16 ; dac MAX bits 31
	ldi r16, 1 
	mov viens,r16 ; 1 reģistrs
	ldi r16,0
	mov nulle,R16 ; nonullē 0 bitu
	ldi R18,0 ;lai startpā visi starusa biti būtu nulle
	mov THparbaude,r16 
	ldi r16,0xff
	mov TLparbaude,r16 
	ldi r16,0
	mov TLjaunais,r16 
	mov THjaunais,r16 
	ldi r19,0

	nop

loop:
	cli	
	sbrc r18,1 ; pārbauda OTE bitu
	rjmp PINset
; *****************************
DACset:
	sbrc r18,3 ; pārbauda DACEn bitu
	rjmp DACmaina
;;Programmas loop

	sbr r18,8 ;set DACEn=1
	sbrc r18,2 ;test VP
	rjmp VP1T
;********************************
	sbr r18,4 ;set VP=1
	sbrc r18,0; Test Virzienu
	rjmp TUP ; Virziens =1
	cbr R18,32 ;DACdirection ---------
;sub DAC,viens ; R1-R17(1) 
	rjmp B
TUP:
	sbr R18,32 ;DACdirection+++++++++
;add DAC,viens ; R1-R17(1)
	rjmp B
;**********************************
VP1T:
	cbr R18,4 ; clear VP bitu
	sbis ACSR,ACO 
	rjmp TACO0
;
	cbr R18,32 ;DACdirection ---------
;sub DAC,viens ; R1-R17(1)
	cbr r18,1 ;set DOWN
	rjmp B
TACO0:

	sbr R18,32 ;DACdirection+++++++++
;add DAC,viens ; DAC+1
	sbr r18,1 ; set UP
B:
	sei
	nop
	nop
	rjmp loop ;iet uz sākumu
;// Šeit būs Step detection daļa 
;/ priekš 500Ksps dabūšanas šitā rutīna jāņem ārā jo viņa visu sistēmu nobremzē riktīgi! un 
; tad vairāk par 150-75Ksps ADC dabūt nevar (katra instrukcija riktīgi iebremzē :( tādēļ izdevīgāk sanākizmantot parasto ADC
PINset:
	cbr r18,2 ; clear OTE=0
	cp OldDAC,DAC ; salīdzina veco ar jauno
	breq N
	mov OldDAC,DAC ;ielādē vecajā DC jauno DAC vērtību
;  TOGLE PIN B2
	sbic PINB,2 ;Test PINB
	rjmp PbIR1
	sbi PORTB,2 ;set bit in PORT
	rjmp DACset
PbIR1:
	cbi PORTB,2 ;clear bit in PORT
N:	; ja ir vienādi tad notikums nav bījis un turpina programmu
	rjmp DACset
 


DACmaina:
	sbrS R18,5 ;DAC direction
	rjmp Minus
	CP DAC,MAX ;salīdzina vai DAC nav MAX 
	breq change
	add DAC,viens ; DAC+1

change:
	OUT PORTC,R1 ; DAC-> PORTC
	cbr R18,8
	sei
	rjmp loop ;iet uz sākumu

Minus:
	CP DAC,Nulle
	breq change
	sub DAC,viens ; R1-1
	rjmp change

;R18 ir Statusa reģistrs;
; 0 bits -> Virziens 0->DOWN; 1->UP
; 1 bits -> OTE (2) 1-> enable; 0-> disable
; 2 bits -> VP (4)(virziena pārbaudes bits) 1-> pārbauda; 0-> nepārbauda
; 3 bits -> DACEn (8) 1-> atļauj(enable); 0-> nemaina
; 4 bits -> Comp (16) 1->on; 0->of
; 5 bits -> DACDirection (32)1->DAC+ ; 0->DC-
; R1 =DAC reģistrs kur glabā dac vērtību

;////////////////////////////////////////////////////////
ANA_COMP:

	sbic PINB,1 ;Test PINB
	rjmp PbIR2
	sbi PORTB,1 ;set bit in PORT
A:
	sbrc r18,0 ;(Pārbauda Virziena bitu	
	rjmp UP ; ja virziens ir UP
; DOWN virziens ************************************
	sbiS ACSR,ACO
	rjmp NEKA ;ja AC0=1 tad turpina

	sbr R18,8 ; Set DACEn bitu	
	cbr R18,32 ; DACdirection --------
;	sub DAC,viens ; R1-R17(1)
UP_Down_beigas: ; šitas nobeigums ir vienads gan UP gan DOWN tādēļ ieliku vienu,
; lai samazinātu koda lielumu :)
	
	sbrc R18,2 ; test VP bitu
	rjmp VPviens	
	sbr R18,2 ; set OTE=1
;	sbr R18,4 ; set Vp bitu
	reti

VPviens:
	cbr r18,4 ; clere VP
	reti

UP: ; UP virziens ********************************
	sbiC ACSR,ACO
	rjmp NEKA ;ja AC0=1 tad turpina
	sbr R18,8 ; Set DACEn bitu	
	sbr R18,32 ; DACdirection ++++++++
;add DAC,viens ; R1+R17(1)
	rjmp UP_Down_beigas ; iet uz kopējo UP_down_beigas

NEKA:sbr R18,4 ; SET (clear) VP bitu
	reti ; rutīna beidzās

PbIR2:
	cbi PORTB,1 ;clear bit in PORT
	rjmp A
;///////////////////////////////////////////////////////
```

 šeit atmegas 8 ADC testa kods (izspiedu ap 307Ksps rezultātu var redzēt uz porta B 0-4 piniem (kuri bija pieslēgti pie DAC konvertiera lai ar oscilu vare'tu redzēt + PC 1,2 pini rāda kad ir piejams ADC rezultāts un otrs atkal priekš enkodera domāts  ::  (šoreiz enkodera kods neietekmē ADC ātrumu jo kopējais koda lielums ir baigi mazs slīdzinot ar comparātora variantu.


```
;Pārbaudīju Atmegas ADC konvertieris gāja pie clock 16Mhz ar 4bit prescaleri (ar 2bit prescaleri
;vairs nekas negāja :( ar max frekvenci ADCgāja uz 307Ksps ar 5bit izšķirtspēju 

#include "m8def.inc"
	rjmp reset 
.org $00e
	rjmp ADC_FD

reset: ; the reset code:
; stack setup; set SPH:SPL to
; RAMEND
	ldi r16, low(RAMEND)
	out SPL, r16
	ldi r16, high(RAMEND)
	out SPH, r16

	ldi r16, 0b00000110 ; Test PB1 pins 
	out DDRB, R16
	ldi r16, 0b00000110	; 
	out PORTB, r16		

	ldi r16, 0b00011111 ; uzliekam PC4-PC0 pinus kā OUtput :)
	out DDRC, R16
	ldi r16, 0b00000001	; uzliekam PC0=1 DAC=2,5V :)
	out PORTC, r16
;ADC uzstādīšana
	ldi r16, 0b00000101 ; 5 kanāls
	out ADMUX, r16
	ldi r16, 0b11101010 ;/4 iet normāli !!
	; prescaler 32 :) pie 38.4Ksps !! 500Khz clock
	;(man vaig tikai 5bit izšķirtspēju
	out ADCSR, r16
	sei
; šitas kods strādā Oscila bilde ir Fotodiodes mapē
.def DAC=R1  ; DAC reģistrs
.def Status=R18 ; statusa reģistrs
.def OldDAC=R2 ; Vecais dac reģistrs kas fiksē līmeņa izmaiņas!
 ldi R16,0
 mov DAC,R16
 mov OldDAC,R16


loop:
	OUT PORTC,OldDAC 
	cli
; salīdzina i
	sbrs R18,0 
	rjmp back
	cbr R18,1 ;clear bit
	cp OldDAC,DAC 
	breq back ; nedara neko (izlaiž)

;change PIN
	mov OldDAC,DAC ; atjauno OldDAC reģistru.
	
	sbic PINB,1 ;Test PINB
	rjmp PbIR1
	sbi PORTB,1 ;set bit in PORT
	rjmp back
PbIR1:
	cbi PORTB,1 ;clear bit in PORT
	rjmp back
back:
	sei
	nop
	rjmp loop

ADC_FD:
	sbr R18,1 ;set ADC bija bitu
	in r16, ADCL
	in r17, ADCH
;šeit 10bit ADC vērtību pārtaisa par 5bit pabīdot 3 bitus pa kreisi :)
	lsL r16 
	roL r17
	lsL r16
	roL r17
	lsL r16
	roL r17
	mov DAC,R17 ; saglabā 5bit ADC vertību DAC reģistrā
	sbic PINB,2 ;Test PINB
	rjmp Pin1
	sbi PORTB,2 ;set bit in PORT
	reti
Pin1:
	cbi PORTB,2 ;clear bit in PORT
	reti
```

 Logīkas kods ir līdz pusei un kautkad nākošnedēļ (kad nopirkšu komparātoru un visu salodēšu arī būs pirmie testi un es domāju arī uztaisīt SAR loģiku var arī to sample hold circruit uzlodēt (jo fpga pinu skaits ir liels,bet to vēlāk!)

----------


## Epis

Atradu litratūru L valodā par ACP http://www.cs.rtu.lv/Pubs/Zagurskis/Signal_Proc_1.pdf 
un tur ir aprakstīts šitas mans variants ko es uz atmegas8 realizēju un arī SAR -> latviski ir STM (secīgas tuvošanās metode) ACP 
Tajā PDf ir aprakstīti visādi ACP variantu (tādā zinātniskā līmenī) un tad lasot par STM ACP (no 36 lapas) bij aprakstiti tie mīnusi kādi parastajam variantam ar 1 comparātoru ir un tie ir tajos momentos kad analogais signāls krasi mainās tad šitā signāla izsekošana var aizņemt papildus laiku, un lai to noturību pret visādiem trokšņiem palielinātu tur ir aprakstīs variants ar 5 comparātoriem (es varu max 4 izmēgināt jo L339 būs 4 comparātori un atšķirība cenā starp 2,1 comparātora modeli nav nekāda tad skaidrs ka jāizmanto visi 4 (dabūšu 4x lielāku ātrumu) 
un šitas variants ir aprakstīs 48 lapā (ar vairāk comparātoriem STM ACP  ::

----------


## Raimonds1

Un pēdējā bildē var redzēt kad analogo singālu meklē(****kaapeec meklee) izmantojot comparātoru un pieregulējot DAC konvertiera vērtību( *** ko dod piereguleeshana)(pa bitiem (sākot no MSB līdz LSB) un kad tiek līdz LSB tad arī uzskata kad process ir pabeigts(***kaads process, kaadi varianti, kas seko), es savā variantā neizmantoju sample/hold loģiku bet uzreiz grūdu signālu iekš Comparātoraa un ar DAC pārveidotāja pēdējo bitu meklēju analogo singālu (jo mans signāls bija sīnus ar samērā zemu frekvenci 350hz bez lieliem trokšņiem un tādā ātrumā analogā vērtība mainās lēnu līdz ar to signālam sekot varēja ar DAC pēdējiem LSB(last significant bit) bitu
šeit es izmēģināju cik tad ātri iet Atmegas8 ADC, pēc dokumenta ar 10bit izšķirtspēju ātrums ir 15.3Ksps un normāli ar zemāku izšķirtspēju var laist līdz 75Ksps, un tad es uzliku megai8 16Mhz pūlksteni un sāku pazemināt ADC prescalera vērtību (**** kas ir prescaler)un kad aizgāju līdz vērtībai 2 tad ADC varirāk negāja (neģenerēja pārtraukuma vektoru!) un tad šeit ir ar /4 prescaleri bilde kā strādā ADC. viņa darbību var redzēt 5bitu DAC rādījumos (DAC atēlo sīnusa vilni (viņš ir tuvs oriģinālajam vilnim) bet es ar savu oscilu īsti nevaru noteikt cik precīzi Atmegas 8 ADC gāja (moš tā precizitāte bija tikai 4 biti (un 5 bits svārstījās to Oscilā redzēt īsti nevar) bet fakts kad ADC max ir pie 307Ksps  (15Ksps vietā), bet stabilāk ADC noteikti ietu ar 150ksps (tas tad varētu būt stabila 5bitu izšķirtspēja)( *** kaapeec leenaks ir stabilaaks)
un tākā man 150Ksps ir pa maz  (jo man būs 2 fotopārtraucējiem sīnusa vilnis jāapstrādā tad uz 1 sanāk 75ksps (pamaz) tad izdomāju kad jāpamēģina uztaisīt šitas ADC uz fpga (tāds salīdzinājums starp AVR un FPGA loģikas super jaudu  un priekš Fpga es jau atradu 300ns L339 4X Comparātori vienā pakā par 20 saņiem  (lētāk nekā Opampi) un, protams vaidzēs rezistorus (priekš fpga es ņemšu SMD mazos (tie ir precīzāki un lētāki ap 1sani) tākā šitas fpga adc konvertieris izmanksās zem 50 saņiem (ja neskaita pašu fpga mikreni) vienīgi būs grūti pārbaudīt ADC precizitāti jo man oscils velk tikai līdz 1Msps  (****kaa veel var paarbaudiit precizitaati)

taa kaa veeleetos shito saprast

----------


## Epis

Nupat atklāju vienu linku http://www.bunniestudios.com/?page_id=12 Tur ir aprakstīts kā uztaisīt ACP uz FPGA izmantojot iekšējos LVDS diferenciālos comparātorus (es pirmstam nemaz nezināju kad tiem diferenciālajiem IO ir savi comparātori un protams arī pašu darbības principu neizpratu tākā priekš manis tas ir jauns fpga iespēju atklājums  ::  
un apskatījos savas cyclone II fpga datasheetā tad sanāk kad tie Comparātori var izšķirt 100mV starpību un strādā no 0-2V tas sanāk 20  reālas pozīcijas (izmantojot CAP) un sanāk kad manai EP2C8 208PQFP ir 138IO un no tiem noteikti kad sanāk kādtu virs 40 Diferenciālie IO pāri ar saviem comparātoriem  ::  (skaitījis īsti nēsu)  kurus reāli tad var izmantot priekš ADC . un protam es mēģināšu pamēģināt izmantot tos LVDS pinus, bet papildus pamēģināšu LM339 comparātorus tur izšķirtspēja bija no  100-5mv (atkarībā no comparātora ātruma) 
bij kautkāds links kur uz Fpga taisīja Sigma delta ACP bet viņam ātrums bīj lēns bet izšķirtspēja gan bīj liela, bet es šitajā variantā īsti nēsu iedziļinājies.
[attachment=0:ff440]LVDS Diferential PIN.JPG[/attachment:ff440]




> Un pēdējā bildē var redzēt kad analogo singālu meklē(****kaapeec meklee) izmantojot comparātoru un pieregulējot DAC konvertiera vērtību( *** ko dod piereguleeshana)(pa bitiem (sākot no MSB līdz LSB) un kad tiek līdz LSB tad arī uzskata kad process ir pabeigts(***kaads process, kaadi varianti, kas seko),


 Tāpēc kad  SAR ACP ,kura darbība un shēma attēlota bildē, darbojās pēc šī te meklēšanas principa jeb lativiski to meklēšanu sauc par STM (secīgas tuvošanās metode) (pēc tā latviešu valodas litretūras avota tur autors šito nosuca tā līdz ar to var teikti kad saīsinājums latviskais STM ~= angļu SAR un tas analogais signāls ir jāmeklē tāpēc kad šeit tiek izmantots 1 comparātors un kā zināms comparātros tikai salīdzina 2 iejas singālus (invertējošo- un neinvertējošo+) un tad ja kāds singāls ir lielāks par otru tad comparātors dod ārā 1 vai 0 (kā tas Opamps ja viņu saslēdz kā comparātoru) un līdz ar to izmantojot comparātoru var noteikt vai analgais(A) signāls ir lielāks par otru signālu(B) vai mazāks par to otru signālu un šito var arī nosaukt par 1bita ACP kas analogosinālu pārveidot digitālā ar 1 bita izšķirtspeju līdz ar to varam detektēt tikai 2 analogo signālu pozīcijas , bet lai izšķirtspēju palielinātu mums tas B signāls ir jāizmanina (jāpietuvina maximāli analogā singāla vertībai un tā kā mēs nezinam cik liels ir analogais (tikai to kad viņš pirmstam bīj itkā lielāks,vai mazāks par B signālu un izejot nošitās informācijas mēs tālāk varam analogo signālu meklēt izmantotjot CAP kas pieslēgts pie B signāla un nākošajā solī mēs B signālu samazinām 2x (ja A pirmstam bīj mazāks par B) un tagat mēs atkal ārbaudam ko mums rāda comparātors un tagat mēs esam ieguvuši jau 2 bitu ACP (varam detektēt 4 analogo signālu pozīcijas) un tā turpina meklēt analogo signālu līdz vajadzīgajai izšķirtspējai  :: 
Tajā grāmatā kura adresi ieliku pirmstam) ir aprakstīti visi mehānismi par to kā analogo signālu var izteikt digitālā

Prescaleris -> ir pūlkstens dalītājs iekš atmegas8 ja mega iet ar 16Mhz un prescaleris ir 8 tad pēc prescalera pūlkstens frekvence ir 2Mhz  ::  
Par to ADC stabilitāti tad es to atmegu laidu uz tādu ātrumu kāds pēc datasheeta nav paredzēt tur rakstīs kad ar max izšķirtspēju ADC iet ar 15Ksps, bet tā atruma robežā 9zūdot precizitātei ieteicami maximālā ir pie 75Ksps. Es izspiedu 307 kas ir 4X vairāk par max ieteicamo un nav nekādas garantījas kad ADC strādās kautcik precīzi līdz ar to 150ksps varētu būt klabs ātrums ar pieņemamu precizitāti 5 biti.  :: 



> (****kaa veel var paarbaudiit precizitaati)


 Es uz šito atbildi nezinu ja kāds zin tad izstātat   ::

----------


## Epis

Nupat uzkodēju pirmo loģikas kodu, kas nokompilējās bez kļūdām, cīņā ar visādām kļūdām pagāja apmēram stunda pārsvarā neuzmanības un dēļ tā kad biju piemirsis dažus kodēšanas paņe'mienus (bet visu ātri atcerējos) 
Un tā vis loģikas lielums 5 bitu ACP ar 1 comparātoru pēc tās mana atmegas8 algoritma kas seko analogam signālam aizņēma 39 LE (LUT) un loģikas ātruma analizētājs rādīja kad max pūlkstens vērtība ir >270Mhz. protams tik ātri neviens pūlksteni neliks, bet vienalga patīkami apzināties kad ir kāda 10X ātruma rezerve.
principā es dublēju visu atmegas8 uzrakstīto kodu pataisno loģikā un priekš galvenās atmegas8 LOOP atdarināšanas (tur bīja kondicionālās instrukcijas (breQ,sbrc utt) kas beidzās ar lekšanas instrukciju rjmp un lai iekš loģikas man būtu tā pate programmas izpildes secība kas uz atmegas kodā tad es izveidoju SM(State machine) stāvokļu mašīna kas ciklo pa apli un pārbauda tos visus bitus, bet starpība loģikas ciklošanā izmantojot SM ir tāda kad katrs cikls izpildās savā pūlkstenī un tur man ir kopā 8 SM stāvokļi kur lēkājot garākais cēļš ir 3 cikli līdz vis sākās no jauna + vēl viens ienākošo signālu detektēšanai kopā 4 un tas nozīmē kad proga izpildās ap 4 pūlkstens cikliem  ::  pie tāda 270Mhz ātruma progas izpildes ātrums ir 67Mhz un salīdzot ar atmegas8 max ātrumu kādā gāja ACP (500Ksps) starpība ātrumā ir 135X    ::  
Rīt noteikti kad pārbaudīšu kodu simulātorā un tad padomāšu par to 4 comparātora loģikas kodu  ::

----------


## Epis

šodien man nekas nesanāca jo konstatēju kad lai izmantotu to LVDS standartu vaig barošanu uz 2.5V, bet manai lielajai platei visām IO ir 3.3V  ::  un tur neko izmainīt (pārlodēt) nevar tākā tagat būs jāizmanto sava pašlodētā plate (jāpārmaina 3.3V uz 2.5V un tad redzēs.
Vēl es iegāju ražotāja fpga Forumā (šiet laikam fpga specu i maz) pajautāju par tiem diferenciālajiem LVDS piniem un to ADC konvertiera būvi, itkā teica kad teorētiski šitos pinus var izmantot šitādiem nolūkiem  ::  bet neviens pagaidām nav neko tādu darījis moš vēlāk kāds pieteiksies un padalīsies pieredzē!

----------


## Epis

Urāā beidzot es pārbaudīju savu FPGA LVDS diferecinālo pinu comparātora darbību un šeit oscila bilde  :: 
[attachment=1:39438]FPGA-LVDS pin hi-low2.JPG[/attachment:39438]
un es pie negatīvā LVDS ielaidu 1.36V un tad mainot pozitīvā pina voltus ar potenciometru (zilā līnija) var redzēt kad tas LVDS pins mainīja savu stāvokli un tā st'vokļa maiņa notika starp 1.26-1.36
īstanībā tas signāls bij baigi trokšņains (laikam tas no kompja nāca jo otram kompim ir organiskā stikla korpus kas neekranē līdz ar to baigie trokšņi bet tāpāt secinājums kad šitos LVDS pinus var izmantot kā super ātrus komparātorus (caur šitiem piniem datus pāraidīt var ar 800Mb/s   ::  līdz ar to tas laikam nozīmē kad comparātori strādā līdz 800Mhz un tad tas nozīmē kad var itkā 800Ksps ADC uztaisīt (pēc sekošanas metodes, bet tas pārāk nereāli būtu labi ja man sanāktu 1Msps robežā (laigan es neizsledzu iespēju kad es pamēģināšu arī 50-100Msps ātrumu (tad redzēs vai tādā ātrumā vispār kautkas ies!)

šeit ir mana pašlodētā fpga plate + papildus 5V barošanas bloks(tur vēl atmega32 stāv un pašlodētais JTAG programmeris (ar štio man bīj baigās problēmas jo uz 2.5V viņš negribēja programmēt un vaidzēja kompī ienākošajem signāliem likt 74hc244 buferi kas tos 2.5V signālus pastiprinātu līdz 5V (savādāk kompis nereaģēja tādēļ arī bij jāliek papildus 5V barošanas bloks.
Un šitā eksperimentējot man liekās kad es vienu savu FPGA plati NOsvilinājis, jo vienā brīdī kautkas notika un abi L5973d baošanas bloki aizgāja pa pieksari un pacēla sprieguma līmeni 3.3V aizgāja uz 4.5V un kodola 1.2V aizgāja uz 2.4V un tad sāka fpga mikrene baigi karst (kā gludeklis) un es pēc tam mēģināju to L5973 FB rzistorus mainīt un 1.2V dabūju atpakaļ (tur bīj problēma ar to 3.3V ref. vadu ko vaidzēja nogrizt lai nemaisa) bet 3.3V dabūt es nevarēju (laikam L5973d nobeidzās) tagat es nezinu var to fpga esu nodedzinājis vai nēsu, kad nopikšu jaunu L5973d tad laikam varēs redzēt ja neies tad 20$ fpga ir nosvilusi  :: 
[attachment=0:39438]Fpga-LVDS_test.JPG[/attachment:39438]

----------


## Epis

man tās kods tā lēnām taisās (tagat maz laika ir) bet es domāju kad viss sanāks un rezultāts būs labs un tā pareiķinot man liekās kad šitas  adc variants uz fpga būs ekonomiski izdevīgāks nekā ar atmegu8(jau pārbaudīts!),vai kādu citu mikreni kā msp430, un arī salīdzinot ar parastajiem ADC konvertieriem (lētākie maksā pie 2.5$ mazumā) šitas fpga variants būs lētāks + ar fpga ir iespēja to singālu uzreiz pārveidot (filtrēt ārā izmaiņas un pēc tam dekodēt) un beigās šitas arī būs energoekonomiskākais variants jo šitie LVDS pini patērē maz enerģijas un viena fpga patērēs daudz mazāk enerģijas nekā vesela čupa citu čipu (ja taisa kādus 10 ADC kanālus uz fpga tad vienozīmīgi tas būs izdevīgāk!)
šitas viss kopā dod papildus motivāciju izvēlēties fpga nevis kautkādu citu čipu vai citu variantu jo iekš vienas fpga ir čupa ar ātriem Comparātoriem  :: 
īstanībā ja vis ies gludi ar šito sin enkoderi tad moš jāuztaisa arī soļa motora mikrosoļu draivera vadība (ieliekot loģiku iekš fpga + pašu čoperi iekš fpga).

----------


## Epis

Uztaisīju pirmo test programmas loģiku kods ir baigi bienkarš apmēram tā ja comparātors rāda 1 tad CAP ir -1 ja comparātors rāda 0 tad CAP ir +1 un ar šitas tad arī sekos tam analogajam signālam. 
Pirmstam taisīju atmegas8 koda analogu loģikā tur man loģikas lielums jau aizgāja līdz 85 bet nupat sapratu kad tik liela sarežģītība nav vajdzīga un tā pa 10 minūtēm nupat uztaisīju šito mazo test kodu kas aizņem 
24Loģikas[attachment=0:b098c]Wavwform bilde.JPG[/attachment:b098c]


```
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
--  Entity Declaration

ENTITY ADC_CON2 IS
    -- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!
    PORT
    (
        clock : IN STD_LOGIC;
		reset : IN STD_LOGIC;
        COMP : IN STD_LOGIC;
        DAC : OUT STD_LOGIC_vector(4 downto 0)
    );
    -- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!
    
END ADC_CON2;

ARCHITECTURE ADC_CON2_architecture OF  ADC_CON2 IS
        type State_machine is (starts,Plus, Minus);
        signal S_loop : State_machine;

        signal DAC_reg : std_logic_vector(4 downto 0);
        signal DAC_reg_out : std_logic_vector(4 downto 0);
        signal OldDAC : std_logic_vector(4 downto 0);
		signal ALL_ones : std_logic_vector (4 downto 0);


component EDge_decoder
    PORT
    (
        clock : IN STD_LOGIC;
        ENC : IN STD_LOGIC;
        STP : OUT STD_LOGIC
    );
    end component;

BEGIN
--***************************
ALL_ones <= "11111";
DAC <= DAC_reg_out; -- Izvadam DAC vērtību !!

Process(clock)
begin
if rising_edge(clock) then
	if reset ='1' then DAC_reg <= "01000"; S_loop <= starts;
	else S_loop <= starts;
		case S_loop is 
			when Starts => if COMP ='0' then S_loop <= Minus;
				else S_loop <= Plus; end if;

			when Plus => if (DAC_reg = ALL_ones) then  S_loop <= Starts ; --Change ir gatavs!
						else DAC_reg <= DAC_reg + 1;  S_Loop <= Starts;
					end if;
	
			when Minus => 
				if DAC_reg ="00000" then  S_loop <= Starts ; --Change ir gatavs!
					else DAC_reg <= DAC_reg - 1;  S_Loop <= Starts;
				end if;
				when Others => S_loop <= Starts;
		End case;
	end if;
end if;
end process;

Process(clock) -- Change 
begin
    if rising_edge(clock) then
            DAC_reg_out <= DAC_reg;
    end if;
end process;

END ADC_CON2_architecture;
```

----------


## Epis

šeit ir bilde kā fpga ACPkonvertieris meklē analogo signālu (tā mkelēšanas amplīduta ir ap 200mv  ::  itkā liekās baigi daudz un kad uzliku to otru signālu filtru, kas dod ārā tikai izmaiņas reālajās ACP vērtībās, tad bīj tāds pārsteigums kad sanāk ACp ģenerēja to signālu pārāk bieži un tagat es sapratu kur problēma - Problēma ir tajā kad tas komparātors var sajust starpību starp 2 voltu līmeņiem ne mazāku kā 100mv (minimums) un ja es signālu meklējot atrodu viņu kad compaātors no 0 uzlec uz 1 tad sanāk kad reālais analogais signāls ir comparātora negatīvais signāls + 100mv un pretēji ja comparātors no 1 lec uz 0 tad analogais signāls ir CAP -100mv un kad es šito korekcijas kodu ielikšu iekš loģikas tad vaidzētu dabūt īsto analogo vērtību  ::  un vēl es sapratu kad uz fpga var uztaisīt augstākas izšķirtspējas ACP (vairāk par 25 pozīcījām jeb sajust mazākas vērtības par 100mv bet lai to dabūtu gatavu vaig protams lielākas izšķirtspējas CAP + bišķi uzlabotāku meklēšanas algoritmu, var arī izmantot pašreizējo bet tad signālu meklēs pārāk ilgi. 
un protams tagat mans mērķis uzlodēt kādu 7-8bitu CAP un uzlodēt vēlvienu CAP 7-8bitu lai varētu pats redzēt kā mans ACP strādā  ::  un tad jau redzēs kas tur sanāk (100% esu pārliecināts kad jāsanāk, tas ir tikai laika jautājums kad es to visu uzķīlēšu )
[attachment=0:8c709]fpga-LVDS-ADC serch_fast2.JPG[/attachment:8c709]

----------


## Epis

šodien iemēģināju LVPECL diferenciālo standarta PINU tas ir tas pats kas LVDS tikai iet līdz 3.3V (lvds līdz 2.5V) tākā ar šito var dabūt lielāku izšķirtspēju un comparātoriem tas treshold voltage ir tiepaši 100mv.
Par štio LVPECL standartu es jau sākumā zināju vienīgais iemesls kādēļ neizmantoju bija tas kad šitie pini ir tikai uz pūlkstens iejām un par visu fpga čipu tādu man ir tikai 4  ::  tākā 1 jau aizņemts tad atliek 3 reāli izmantojami LVPECL diferenciālie comparātori un 2 no tiem es domāju tagat izmantot priekš testēšanas.
Vispār es pēdējās dienas baigi nočakarējos ar to Loģiku jo nezināmu iemeslu pēc man vairāk tā pamat signāl meklēšanas loģika negribēja strādāt kā pienākās (ārā nāca ne tie signāli) un tad es vairākas dienas meklēju iemeslu un protams atradu, problēma bij loģikas pūlkstens signālos kurus vaidzēja laist pa speciālu pūlkstens signālu domātām līnijām un pirmstam es tos brīdinājumus ko proga mūžīgi ārā meta neņēmu vērā bet rekā tomēr vaidzēja ņemt vērā, jo savādāk loģika normāli strādāt nevar.

----------


## Epis

Izdomāju kad jāiztestē parastie comparātori kā LM339 un papildus uzlodēju vēlvienu DAC pārveidotāju bet šoreiz 6 bitu (lai dabūtu lielāku izšķirtspēju  ::  un pieliku vecajam 5 bitu ADC 6 bitu  ::  tagat man ir 2x 6bit  DAC + 4 kanālu komparātors un tad nosākuma palaidu iepriekš uzrakstīto loģikas kodu -> rezultāti nebīj neko labi jo pēc signāla atrašanas algoritms uzreiz nemainīja DAC vērtību uz pretējo pusi bet turpināja iesākto virzienu ar +2 vērībām un tad mainīja virzienu un tad sāku pētīt kas pa lietu un tā pagāja divas dienas kamer uztaisīju pavisam jauna tipa loģiku kas meklējamo vērtību maina uz rez kad signāls ir atrasts (oscila bildē augšējais sarkanais ir DAC meklētāj signāls un zilais ir analogais) bet ar to visas problēmas nebeidzās es pamanīju kautkādu anamāliju kas notiek fpga mikrenes iekšīenē ar šo DAC vērtības reģistru un zemāk ir bilde kur var redzēt kā nonekā DAC konvertiera visi biti uzlec uz 111111 vai uz 000000 (attiecīgi nonullējās un uzliekās) pašā kodā tādas operācijas nekādas nav līdz ar to iz izslēgta šādas negaidītas izmaiņas tātad sanāk kad kautkādu X apstākļu ietekmē fpga mikrenes iekšīenē šie reģistri pārstartējās (moš vainīgi trokšņi!vārdsakot pagaidām īsti nezinu kur problēma bet to obligāti vaidzēs noskaidrot ! 
[attachment=1:5a52b]FPGA+comparators.JPG[/attachment:5a52b]
[attachment=0:5a52b]FPGA+comparators foto.JPG[/attachment:5a52b]

----------


## Vikings

Gribu tikai iespamot, ka tas oscis liekas ir par lēnu. Normāli būtu, ja signālu varētu redzēt ar visiem izliekumiem, bet šit skaidri var redzēt taisnas līnijas - savienojumus starp sampliem un.

----------


## Epis

nu jā, man tas iekšējais pūlkstenis bīj 16Mhz (otrs 500Khz)tādēļ viss notiek tik ātri kad ar oscilu var redzēt tikai rezultātu, jāpamēģina pūlksteni nolaist uz 1Mhz un (31.25Khz) tad vissi procesi notiks 16X lēnāk  ::  un varēs labāk oscilā redzēt notiekošo jeb signāla meklēšanas DAC soļus.
Vispār man liekās kad tās anomālijas kas bīja iekšējos fpga reģistros ir dēļ nepareizi uzstādītajiem clock signāliem kas varētu tur tos reģistrus arī čakarēt par šito tēmu tagat es meklēju atbildi alteras forumā http://www.alteraforum.com/forum/showthread.php?t=754
tur ir topiks par veidiem kā pareizāk samazināt pūlkstens signālu, 
Vēl iemēģināšu šito pašu kodu uz otras fpga plates (lielā dev.kita) un tad ja tur tie gļuki būs tādi paši tad var droši atmest trokšņus un citus iemeslus kas saistīti ar pašu fpga plates dizainu, barošanu utt. jo dev kitam tur problēmu nav un strādā viņš stabili.
šitie arī ir pirmie savas paštaisītās plates reālie eksperimenti tādēļ iespējamo kļūdu cēloņu ir daudz un vismaz vienu izdosies atmest ja iztestešu kodu uz dev.kita  ::

----------


## Vikings

Ā un vēl - uz tavas FPGA plates bija kļūda - laikam viena PLL barošana nebija pieslēgta, tā dēļ arī kaut kas var gļukot. Es savai platei arī nebiju to pievienojis un PLL nestrādāja kamēr nepievienoju PLL barošanas kāju.

----------


## Epis

Dīvaini šorīt pamēģināju vēlreiz to pašu kodu un gāja bez gļukiem nekādas lielās izmaiņas kodā netiku veicis (ienākošo comparātora signālu izlaidu caur papildus reģistru, ar 16Mhz pūlksteni. 
īstanībā man jau apnika čakarēties ar to LVDS,LVPECL comparātoru testešanu un tākā es tagat esu dabūjis stabilu rezultātu ar parasto Comparātoru un domāju arī palikt pie kombinācijas parastais comparātors + R/2R 6bit DAC  un šitā es iegūstu ADC ar ~50mv izšķirtspēju  ::  un ātrums ir tāds kāds ir paša comparātora ātrums un comparātors ātrākāk par 1000-500Khz neiet (man priekš enkodera tas ir pietiekami liels ātrums)
Nākošais varētu padomāt pie tām sīnusa vērtībām lai tad varētu ģenerēt Quadratūro enkodera signālu  ::

----------

