Lite nischat projekt men ändå rätt komplicerat och därför intressant.
Jag laborerar med olika former av synthar och har en (ganska) färdig VA synth som jag jobbat med i två år nu.
Nu är jag sugen på något med helt analog signalkedja förutom VCO som istället får bli DCO.
Anledningen är att möjligheten att använda komplexa vågformer, samples och en mängd oscillatorer är enormt värdefull.
I övrigt skall signalkedjan vara analog är tanken.
Filter (AS3320) från Alfa RPAR i Lettland som gör reproduktion av gamla obsoleta ljudprylar.
VCA har jag en egen beprövad design baserad på helt diskreta komponenter.
Att ha full kontroll och många moduleringsmöjligheter på en analog signalkedja kräver massor med kontrollspänningar (CV).
För att göra saken värre så skall jag ha minst 8 röster polyfoni (ev. 16 med 8 stereo som valmöjlighet).
Så jag behöver:
Något som kan producera 16 ljudkanaler med komplexa vågformer.
Något som programmerbart kan producera (minst) 48 olika (oberoende) spänningar och som kan modifiera dessa snabbt (desto fortare desto bättre).
Något som helst inte tar enormt med CPU kraft.
Lösningen blev att skicka ljuddata vi TDM (256 bitars frame size, 8 stereo kanaler) och splitta upp TDM paketet och genererar 8 st stereo I2S strömmar som var och en går till en billig R2R Audio DAC Chip.
För spänningarna så hamnar man snabbt i sample and hold tankar, om man inte skall gödsla med DAC chip.
Så lösningen där vart en två kanalig 12-bit DAC som jag sedan muxar varje kanal med 74HC4051, som då laddar kondingar vilka buffras av Opamp (traditionell S & H).
Det kan vara lite voodo över S&H kretsar och hitta lagom typ och storlek på kondensator. Även timingen är viktig.
Ju oftare man uppdaterar kondingen desto bättre stabilitet i spänningen, men samtidigt skall kondingen hinna ladda upp/ur till rätt nivå.
Att uppdatera många värden så ofta, med en MCU som dessutom har massa nadra saker att göra tar både MCU kraft och ställer krav på interrupthantering.
När jag summerade alla krav ovan så insåg jag att en smart väg att gå är att använda en FPGA.
Att bryta upp TDM frames till multipla I2S kanaler är barnlek för en FPGA och att med kontinuerlig och jämn takt sätta en ett värde på DAC, styra alla inhibit signaler på 4051 i rätt takt är klar en FPGA grej med.
När man är van med MCU och går till FPGA så blir man nästan "star struck" över att allt går parallellt. Det känns lite som en kvantdator
Som jag trodde var TDM -> 8*I2S ganska lätt så den verilog modulen vart klar snabbt.
Det var lite knepigare att skapa styrningen av DAC chippet (MCP4822) med SPI (SPI gränssnittet är mycket snabbare än I2S), men det gick bra det med.
Sedan måste jag ju ha ett sätt att sätta spänningarna, så jag fick bygga ett SPI slave gränssnitt till FPGA'n.
Så det vart tre verilog moduler (och en top såklart).
När jag testade lite i går så styrde jag spänningarna från en BluePill och en full förändring 0 -> 4095, 4095 -> 0 (12 bit DAC) gick på 9.6mS.
Nu vet jag inte vad som var gränssättande, MCU gränssnittet (SPI överföringen var satt till 4.5 Mbit/s) eller något annat.
Jag tycker ändå det känns helt ok att ändra spänningen 8192 ggr på 9.6mS
TDM splittern, tja den gör det den skall.
Jag genererade 16 olika sinus toner och alla dök upp på varsin analog.
Dock drog 8st R2R Audio DAC lite mer ström än vad USB porten trivdes med så vid första försöket hade jag lite dist, så det tog lite tid att hitta felt (det var för enkelt för att hittas lätt)
Med extern matning vart ljudet perfekt. Antagligen lurar man sig själv men jag kan tycka att R2R DAC är lite mjukare i ljudet än Delta Sigma. Cippen jag använder är lite roliga, för dom kommer från en helt okänt (för oss i väst) kina tillverkare (Titan) och kostar strax över 1:- styck
En kort förklaring till bilden:
Högst upp BluePill lab kort bara för att generera SPI data till vilka spänningar jag vill ha.
I mitten huvudkortet (FPGA är en Tang Nano 9K som sitter på undersidan).
Den gröna linjen är de 8 Stereo Audio DAC chippen som skapar de 16 olika ljudkanalerna som går ut på kopplingsplinten i kanten.
Den röda linjen är filter och Opamp för att buffra signalen.
Det undre kortet är S&H kretsen, där den blå linjen är OPampar som buffrar den samplade spänningen i kondensatorerna (dom sitter runt om nära).
Den gula linjen är två 4051 Mux chip, och under den en ensam SO8 som är den 2 kanaliga DAC som genererar spänningen.
Jag kan koppla 6st S&H kort till ett huvudkort (totalt 96 spänningar) och det påverkar inte farten om det är 1-6 kort eftersom FPGA gör det parallellt.
IMG_0371[1].png