Hur fixar man klockkretsar upp till 160MHz?
Hur fixar man klockkretsar upp till 160MHz?
Jag har en FPGA som jag vill driva i 160MHz, men var får man tag på en klockkrets för så höga klockfrekvenser?
Mig veteligen finns det inte kristaller upp i de frekvenser och då får man ta till lite trix: frekvensmultiplikation.
Om man t.ex. har en 20MHz frekvens kan man multiplicera med 8 och får då 160MHz. Det finns många sätt men rent omedelbart vill jag rekommendera dig att kolla PLL (Phase Lock Loop) som i grova drag är en oscillator som har justerbar frekvens. Man delar då ner utgångsfrekvensen med ett vald värde (i detta fall
och jämnför med referens-frekvensen (20MHz) och trimmar frekvensen löpande.
Man kan också göra på riktig radioamatör sättet och göra en frekvensdubbling i 3 steg (= 8x totalt), det kräver lite avstämda kretsar osv men fungerar minst lika bra.
Om man t.ex. har en 20MHz frekvens kan man multiplicera med 8 och får då 160MHz. Det finns många sätt men rent omedelbart vill jag rekommendera dig att kolla PLL (Phase Lock Loop) som i grova drag är en oscillator som har justerbar frekvens. Man delar då ner utgångsfrekvensen med ett vald värde (i detta fall

Man kan också göra på riktig radioamatör sättet och göra en frekvensdubbling i 3 steg (= 8x totalt), det kräver lite avstämda kretsar osv men fungerar minst lika bra.
Det hela gäller en CPLD (XC9536XL). I databladet står det "System frequency up to 178 MHz". Antar att det betyder att den kan klockas upp till 178MHz. Jag sökte på Google på "crystal oscillator 160 MHz". Det verkade finnas ganska många som gjorde sånna och om de kanske såldes i Sverige. Men jag ska kolla på PLL oxå. Något bra tips på PLL krets?
XC9536XL: http://www.farnell.com/datasheets/28287.pdf
XC9536XL: http://www.farnell.com/datasheets/28287.pdf
Det finns en viktig sak att tänka på för CPLD/FPGA:er. "System frequency up to 178 MHz" är en marknadsföringssiffra. Det går att uppnå för vissa funktioner men det är kört om du vill utnyttja kretsens funktionalitet till 100%. En processor som är specad att klara t.ex. 20 eller 166 MHz kan du alltid klocka så fort (även om inte allt inuti processorn klockas med den hastigheten behöver du inte bry dig om det). För en CPLD/FPGA så "konfigurerar" man tillgängliga resurser i kretsen och beroende på det får man olika fördröjningar för de elektriska signalerna. Långa fördröjningar betyder lägre klockfrekvens. Hur fort man kan klocka den vet man oftast inte förrän man har designat klart. Om vill bygga system av flera kretsar och behöver bstämma klockfrekvens i förväg är det vanligt att man av erfarenhet vet ungefär hur snabbt viss funktionalitet kan klockas och så gör man en liten konservativ bedömning av klockfrekvensen.
Det är då aldrig lätt att göra något elektroniskt 
Men det jag i huvuddrag vill göra är att använda en A/D-omvandlare som klarar 80MSPS och föra över det till ett SRAM minne. Tänkte att FPGA/CPLD:n skulle vara spindeln i det nät för att föra över A/D-omvandlarens värde till rätt adress på SRAM:et. Hade oxå funderingar på att ersätta FPGA:n med räknare som skulle föra över värdet till rätt plats i minnet men det kändes svårare att synca. Såg att andra hade löst det med FPGA/CLPD fast för lägre hastigheter. Men jag kände att 80MSPS vorde en trevlig utmaning.
Någon som har något förslag på lösning?

Men det jag i huvuddrag vill göra är att använda en A/D-omvandlare som klarar 80MSPS och föra över det till ett SRAM minne. Tänkte att FPGA/CPLD:n skulle vara spindeln i det nät för att föra över A/D-omvandlarens värde till rätt adress på SRAM:et. Hade oxå funderingar på att ersätta FPGA:n med räknare som skulle föra över värdet till rätt plats i minnet men det kändes svårare att synca. Såg att andra hade löst det med FPGA/CLPD fast för lägre hastigheter. Men jag kände att 80MSPS vorde en trevlig utmaning.
Någon som har något förslag på lösning?
Det du vill göra kan nog gå, behöver du köra på 160MHz eller kan det räcka med 80MHz?. Jag har inte läst det fullständiga databladet men magkänslan är att det kan bli besvärligt med 160MHz, men låt mig inte avskräcka dig att testa det kan nog gå. Om du bara fixar interfacet till AD-omvandlaren kan man ju sedan sänka datatakten genom ha en bredare internbuss. T.ex. om AD-omvandlaren är 8-bitar så kan du sedan lägga data parallellt i en 16-bitars buss.
Kör på med en CPLD, fast lite större än '36 kanske du behöver. 80MHz räcker väl för 80MS/s, varför 160?
Jag har gjort nästan exakt samma sak, fast i 40MHz och med en gammal 5V 9572:a och asynkront SRAM från ett gammalt moderkort. Det fanns även en (väldigt) enkel trig-funktion och utläsning (via parallell-port).
Med en snabb speed grade av XC95**XL så borde väl 80MHz inte vara något problem, svårare att hitta lämpligt RAM kanske.
Annars finns det "färdiga" FIFO-minnen du kan använda, inga räknare behövs.
edit: en anledning att köra med högre klockfrekvens kan kanske vara att skapa korrekta skrivpulser till ett asynkront SRAM, jag fuskade och använde grindad klocka.
För högre hastigheter är det nog bättre med synkrona SRAM.
Jag har gjort nästan exakt samma sak, fast i 40MHz och med en gammal 5V 9572:a och asynkront SRAM från ett gammalt moderkort. Det fanns även en (väldigt) enkel trig-funktion och utläsning (via parallell-port).
Med en snabb speed grade av XC95**XL så borde väl 80MHz inte vara något problem, svårare att hitta lämpligt RAM kanske.
Annars finns det "färdiga" FIFO-minnen du kan använda, inga räknare behövs.
edit: en anledning att köra med högre klockfrekvens kan kanske vara att skapa korrekta skrivpulser till ett asynkront SRAM, jag fuskade och använde grindad klocka.
För högre hastigheter är det nog bättre med synkrona SRAM.
Jo jag vill väl köra med en CPLD för att det verkar bra. Kände väl att om den kör på 80MHz så hinner den kanske inte ta emot parallellt från A/D:n och lägga ut till minne under 1/80M s.
FIFO är klart bra men jävligt dyrt om jag vill ha lite storlek på minnet. Då är det kanske enklare att lagra datan i CPLD:n istället. Sitter och planerar för ett 1Mb SRAM asynkront men bör kanske kolla på synkrona istället. Jag vill nämligen kunna använda detta till att sampla under mååånga klockpulser för att undersöka tex seriella överföringar i snabba hastigheter. 1Mb minne och 8-bit A/D ger ju då ~128000 mätvärden.
Anledningen till att köra en FPGA/CPLD en bit snabbare än A/D:n är ju att jag inte vill ligga på gränsen med den komponenten.
Fler tips uppskattas...
FIFO är klart bra men jävligt dyrt om jag vill ha lite storlek på minnet. Då är det kanske enklare att lagra datan i CPLD:n istället. Sitter och planerar för ett 1Mb SRAM asynkront men bör kanske kolla på synkrona istället. Jag vill nämligen kunna använda detta till att sampla under mååånga klockpulser för att undersöka tex seriella överföringar i snabba hastigheter. 1Mb minne och 8-bit A/D ger ju då ~128000 mätvärden.
Anledningen till att köra en FPGA/CPLD en bit snabbare än A/D:n är ju att jag inte vill ligga på gränsen med den komponenten.
Fler tips uppskattas...
Den ska ju inte ta emot data och lägga ut det till minnet under 1/80 us. Det viktiga är ju att den kan hålla datatakten dvs ta emot 80Mbyte data per sekund och sedan skriva 80 Mbyte/s (eller 40Mword/s (om word = 16 bitar), eller 20M*32bitar/s osv).
Mellan att en unik byte läses från AD-omvandlaren till att den skrivs till minnet kan man ha en fördröjning internt i CPLD:n som beror på vad man gör med datat.
Mellan att en unik byte läses från AD-omvandlaren till att den skrivs till minnet kan man ha en fördröjning internt i CPLD:n som beror på vad man gör med datat.
Nu ska vi se om jag har fattat saker rätt.
För att klara A/D 80MSPS så behöver jag en FPGA/CPLD som klara minst 80MHz (såklart). Om jag sen använder ett synkront burst SRAM tex 32kx32 så behöver inte minnet vara jättesnabbt, minst 20MHz. Jag plockar in 4st 8-bitars värden från A/D och sen "klockar" jag ut dom till minnet. Rätt? Det verkade nämligen enklare att få tag på synkrona minnen med mer än 8 dataportar.
För att klara A/D 80MSPS så behöver jag en FPGA/CPLD som klara minst 80MHz (såklart). Om jag sen använder ett synkront burst SRAM tex 32kx32 så behöver inte minnet vara jättesnabbt, minst 20MHz. Jag plockar in 4st 8-bitars värden från A/D och sen "klockar" jag ut dom till minnet. Rätt? Det verkade nämligen enklare att få tag på synkrona minnen med mer än 8 dataportar.
Det blir en stor ganska CPLD om du ska lägga upp 32 bitar (32 vippor) och sen adressräknare osv.
Men det brukar vara byte enables på de SRAMen, så du kan skriva in en byte åt gången, och jag *tror* (men kolla upp det) att byte enable även styr när man läser ut, så du kan helt enkelt koppla ihop dessa 4*8bit (eller 2*8bit) dataledningar till en gemensam 8bitars buss.
Minnet, ADC och CPLD klockas alla med samma 80MHz klocka, och CPLDn styr adressen samt styrsignalerna till minnet (och eventuellt även buffrar/mellanlagrar datan från ADC, men det är inte nödvändigt).
Men det brukar vara byte enables på de SRAMen, så du kan skriva in en byte åt gången, och jag *tror* (men kolla upp det) att byte enable även styr när man läser ut, så du kan helt enkelt koppla ihop dessa 4*8bit (eller 2*8bit) dataledningar till en gemensam 8bitars buss.
Minnet, ADC och CPLD klockas alla med samma 80MHz klocka, och CPLDn styr adressen samt styrsignalerna till minnet (och eventuellt även buffrar/mellanlagrar datan från ADC, men det är inte nödvändigt).