Naar aanleiding van mijn post in het PCB topic, wil ik wel wat uit de doeken doen over een recent project, een Logic Analyzer. Nu is een logic analyzer niet uniek, er zijn heel wat kant-en-klaar ontwerpen te vinden op Aliexpress en andere webwinkels. Het doel echter, welke ik heb voor mijn logic analyzer, is anders. Huidige ontwerpen zijn bedoeld voor vooral seriële protocols, zoals SPI, I²C, UART etc. Ik wil kijken naar een processor bus. Ik wil weten welke adressen de processor aanspreekt, en welke data erover gaat. Bijvoorbeeld van een 68000, 6502, 8088 en nog meer van dat soort oude processoren. Het gaan dan over veel I/O. een 32 bit adres bus, 32 bit databus, wat chip enables, byte enables, read, write, ga zo maar door. Mijn logic analyzer heeft de mogelijkheid tot max 96 kanalen.
Voorbeeld van een processorsysteem.
Goedkope analyzers hebben te weinig I/O voor mijn toepassing.
Analyzers met meer I/O vallen net buiten mijn budget.
Veel I/O zorgt voor veel data. Meer dan dat een USB2 verbinding aan kan. De gebruikelijke oplossingen, zoals een FTDI 2232H of een Cypress USBFX2 zijn helaas niet bruikbaar voor mijn doel. Nu kan ik, door buffer geheugen te gebruiken wél snel data verzamelen, die daarna traag over de USB bus gaat. Gelukkig heeft FTDI een nieuw product, de FT601B. Dit is een chip, met een makkelijke 32 bit parallel FIFO interface erop, en USB3.0 5Gbps snelheid. Ik heb ervaring met de FT245, en de FT601 interface beloofd een soortgelijk protocol.
De manier om 96 bits op een 32 bits bus te krijgen, is een multiplexer. Nu is 100MHz, welke de FT601 geeft, een beetje snel voor reguliere TTL logica, dus een FPGA lijkt me op zijn plaats. Nu we toch een FPGA gebruiken, kunnen we meteen een heleboel meer logica inbouwen. Ik zou, omdat de I/O pins op een FPGA bidirectioneel zijn, ook een pattern generator functie kunnen inbouwen. Uitgebreidere trigger mogelijkheden, een crosspoint switch, nog meer toeters en bellen?
Uiteindelijk ben ik op mijn ontwerpkeuzes gekomen:
- USB3 interface naar de PC.
- Compact ontwerp
- Kan werken met een bereik aan ingangsspanning, dus niet alleen 3.3V en 5V.
Hierop heb ik met een FT601B dev kit gespeeld. Je kunt deze evaluation modules kopen van RS, Farnell, Digikey en andere groothandels. Ze zijn te krijgen voor de expansieconnectors van Altera (Intel) en Xilinx FPGA borden. Een Terasic C5G was voor mij nog redelijk goedkoop.
Na een tijdje met deze combinatie gespeeld te hebben, viel het mij op dat de overdrachtssnelheid naar de PC niet echt super is. Aangezien wel het Super Speed protocol wordt gebruikt was dit wel vreemd voor mij. Wat speuren in de voorbeelden die FTDI geeft, kwam ik er achter de de D3XX driver, die te downloaden is en bedoeld voor de FT600/FT601, nogal wat tijd gebruikt om de overdracht te initiëren. Door meer data in 1 keer over te sturen, gaat het aanmerkelijk sneller. Nu heb ik het dus over (veel) meer dan de 4KB buffer van de chip zelf. Pas bij 256KB pakketten, kwam er wat snelheid uit (zeg 300MB/s).
Ik moet dus aardig wat data klaar hebben staan. Dat betekend meer geheugen. Zoveel zelfs, dat ik ben gaan zoeken naar een externe geheugenchip. DDR2, LPDDR2, en andere vormen van dynamisch ram zijn wel snel, maar hebben redelijk wat overhead in de vorm initialisatie en arbitrage. Traditioneel SRAM is traag. Synchroon SRAM heeft een klok, en kan dus snel werken. Een nadeel van dit Zero-Bus-Turnaround of No-Bus-Latency SRAM is dat de data pas 2 klokpulsen volgt nadat je het adres hebt opgegeven. Geen probleem, hier kan ik wel wat op verzinnen.
Al met al wordt het me duidelijk wat voor een I/O ik moest hebben op mijn FPGA:
- ongeveer 50 I/O voor naar mijn FT601.
- 96 I/O voor mijn UUT interface, met 6 tristate lijnen om mijn buffer IC's om te zetten van ingang naar uitgang (pattern generator!).
- ongeveer 55 lijnen naar mijn SRAM.
Dit is geen job meer voor een QFP, en dus gaat het een BGA worden. Nu heb ik nog nooit met BGA's gespeeld in de hobbysfeer, wel op het werk. Nu we toch beland zijn op een BGA, kunnen we meteen de SRAM kiezen in BGA. Dat scheelt plaats op mijn PCB, en het rijmt met het compacte ontwerp welke ik wil maken.
De gekozen behuizing is een blauw semi-transparante handbehuizing van Hammond. 1553DTBUBKBAT Heeft een uitsparing voor een 9V blok. Daar gaan mooi die I/O connectoren in!
Printje.
Hoe krijgen we een Cyclone 10 op een PCB? Ik zeg Verfstripper. Eerst alle pads vertinnen, schoonmaken, gelflux erop en maar heet stoken.
Hoera, hij zit erop!
Hoe gaan we dit testen? Ik moet natuurlijk alle spanningen toevoeren. 3.3V met mijn voeding, 2.5V LDO op de PCB, en 1.2V buck converter moet er ook op. Een hoop superkleine 0402 condensatoren op de onderkant, bulk condensatoren ook. Uren aan soldeerwerk. Dan kan ik met de programmer beurtelings een pulsje zetten op elke I/O pin. Zie ik een puls met mijn scoop -> I/O pin werkt. Geen puls? Niet verbonden. 2 pulsen betekend dat ik sluiting heb.
ALLES werkt! Gesterkt met dit feit, kan ik nu alle andere componenten plaatsen.