FPGA-baserad synth

Berätta om dina pågående projekt.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Tanken hade slagit mig med, men MCLK/LRCLK var helt säkert 256, det kollade jag massor med gånger.

En grej som jag hade missat var dock att data läses in efter en delay på 1.5 SCLK cykler efter förändring på LRCLK och inte efter 0.5 (LRCLK och SDATA uppdateras på fallande SCLK flank).

Att det skall vara 1.5 cyklers delay syns tydligt i figur 4 på sidan 9, men jag hade blivit förvirrad av figur 8 på sidan 11.
Det är även lite förvirrande när de pratar om "I2S Left-Justified Data Format", vilket i mina öron låter just som att delayen inte skall vara där. Fast senare i står det "The MSB is valid on the second SCLK rising edge after LRCLK transitions low to high or high to low", så hade jag bara läst ordentligt så borde det inte blivit några missförstånd.
Detta gjorde att när jag försökte skicka fyrkantsvågen så lästes värdena "0000000000" och "1111111110" istället för "0000000000" och "0111111111" vilket gör en enorm skillnad eftersom datat är i 2 komplement form.

Det lite märkliga i sammanhanget är dock att jag vet att jag i något skede testade att skicka "0001111111" utan resultat, men jag har fipplat runt så mycket i koden att det mycket väl kan vara så att jag lagat något annat som inte riktigt stämde.

Hursomhelst så funkar det nu iaf:

ett C5
Bild

brekoutkortet in action
Bild
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Det här projektet har legat och vilat lite medans jag höll på med det här: http://elektronikforumet.com/forum/view ... 30&start=0
men nu har jag haft lite tid att pilla på detta.

Jag valde att skippa och slänga in en soft-cpu och körde MIDI implementationen direkt i VHDL.
I nuläget är "skalet" till det implementerat och lite basfunktioner som note-on och note-off.
Jag märkte att mitt val av optokopplare inte var särdeles bra, VCE blir ~2V med 280ohms pullupmotståndet, så jag vart tvungen att byta ut det mot ett 1kohm.
Problemet är bara att stig och falltiderna då blir lite väl långa, så jag fick ändra uarten så att den samplar mer i mitten för att det skulle funka.
75-301-99 skulle nog vart ett bättre val, men så kostar den ganska mycket mer än EL817an.

Hursomhelst så går det iaf att spela små truddelutter med ett MIDI-keyboard kopplat till den :tumupp:
Så nu kan jag fortsätta med och utveckla själva synthen mer (just nu är den mest en MIDI-styrd funktionsgenerator).
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Statusupdate:

Jag har implementerat så att synthen kan spela 8 noter samtidigt.
Först gjorde jag så att de uppdaterades parallellt, men har nu ändrat de till seriellt för att spara plats (från 31% till 22% blev resultatet).

Nu håller jag på med att försöka få in så pitchbenden fungerar, men det krävs lite ändringar för att få det att fungera.
Som jag gjort hitills är att jag har en tabell med alla noter (0-127) och deras respektive värde för uppdateringen av oscillatorerna. Detta fungerar bra så länge vi har fulla seminoter, men med pitchbenden behöver jag få in värdena emellan dessa. I stort sett behöver jag räkna denna formeln: 440 * 2^ ((n-69)/12) direkt i vhdl-koden (n är notnumret).
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Nu har jag fått ordning på pitchbenden.
Jag löste det genom att skapa en look-up-table med 100 värden som innehåller 2^16/(2^n/1200) där n är 1-100.
sen så multiplicerar jag med det värdet och skiftar höger 16 steg för att få <nuvarande not>/2^(n/1200)
<nuvarande not> har jag fortfarande i en annan look-up-table med 128 värden, ett värde för varje not.
Jag var inne på att ha noterna i en look-up-table med bara 12 element och sedan räkna ut rätt oktav genom att skifta x antal steg, men eftersom detta kräver att man delar med 12 för att pricka rätt element så stjäl det en multiplicerare och jag tror jag kommer ha nytta av de framöver så jag håller mig till tabellen med 128 element än sålänge.

Ett litet test av pitchbenden: http://www.sk-electronics.com/sk-synth/ ... _test2.mp3
Användarvisningsbild
psynoise
EF Sponsor
Inlägg: 7226
Blev medlem: 26 juni 2003, 19:23:36
Ort: Landvetter

Re: FPGA-baserad synth

Inlägg av psynoise »

Det var ett litet svårt lyssningsprov, ett svep hade sagt mer om funktionen :). Många midi-synthar har 14 bitar (16-2 eller?) upplösning på pitch-benden.

För att skapa en tontabell finns MTS, men det visste du säkert redan om du har kommit så här långt.

http://en.wikipedia.org/wiki/MIDI_Tuning_Standard
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Jo, testet var "live" med midi-keyboardet. Det var mest för att visa att det funkar, inte om det funkar bra eller dåligt.

Jo, 16-2 bitar (0x000 - 0x3FFF) är upplösningen på pitchbenden, sen vad det representerar beror på synthen. Men vad jag läst mig till så är det brukligt att default är 2 halvtoner uppåt och 2 halvtoner neråt.
Sen kan man ställa in det med en RPN, men för tillfället fungerar bara "rangen" med 4 halvtoner.
Problemet blir att om man vill öka upplösningen så krävs det fler element i tabellen, alternativt mer avancerade beräkningar.
Eftersom det finns massor annat att implementera för tillfället får 1 cents upplösning duga tills vidare iaf.
Användarvisningsbild
psynoise
EF Sponsor
Inlägg: 7226
Blev medlem: 26 juni 2003, 19:23:36
Ort: Landvetter

Re: FPGA-baserad synth

Inlägg av psynoise »

Eftersom du kör FPGA kanske det är möjligt att köra beräkningar på allt och hoppa över allt vad tabeller har med att göra, men det är kanske inte den lättaste vägen dock.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: FPGA-baserad synth

Inlägg av Andax »

"...pricka rätt element så stjäl det en multiplicerare..."

En multiplicerare går ju att återanvända till flera beräkningar. Du kan ju köra fpgan på mycket högre klockfrekvens än samplingsfrekvensen och hinna med flera olika typer av beräkningar mha av samma resurs som är multiplexad.
Användarvisningsbild
chille
Inlägg: 2469
Blev medlem: 25 juni 2003, 20:54:41
Ort: Stockholm
Kontakt:

Re: FPGA-baserad synth

Inlägg av chille »

Oj vad sugen man blir på att börja skruva synthar nu igen. :D Jag tänkte ju slänga in min modulära synth (utvecklar i C) på en FPGA förut, men det blev aldrig något av det.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Andax skrev:"...pricka rätt element så stjäl det en multiplicerare..."

En multiplicerare går ju att återanvända till flera beräkningar. Du kan ju köra fpgan på mycket högre klockfrekvens än samplingsfrekvensen och hinna med flera olika typer av beräkningar mha av samma resurs som är multiplexad.
Du har givetvis rätt, dock är det givetvis inte samplingsfrekvensen rakt av som begränsar (t.ex. så går det åt åtta klockcykler att uppdatera alla åtta "rösterna"), men det finns nog fortfaranade mariginal att ta av så samma multiplicerare skulle kunna användas till flera olika saker.
Sättet jag löst det på är inte skrivet i sten, men för tillfället så har jag inte snålt med blockram och romen som jag har sinuskurvorna i är inte optimerade (alla värden finns i tabellen, det går att optimera till en fjärdedel).
Dock har jag funderingar på att byta ut sinusrommet till ett ram och sen göra det möjligt att ladda olika vågformer från flashminnet in i blockramet (då kan även sinuskruvan ligga i flashminnet).

Men som sagt innan, lösningen som jag har nu med pitchberäkningarna får vara som de är för tillfället. Det som står på agendan nu är att implementera LFO, filter och ADSR.

EDIT: P.S. Har du påtat vidare nått i din synth Andax?
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Eftersom psynoise efterfrågade ett bättre lyssningsprov på pitchbenden så gjorde jag ett svep

http://www.sk-electronics.com/sk-synth/ ... _test3.mp3

Bild
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Implementeringen av LFOn går framåt, vågformerna sågtand, triangel och fyrkantsvåg går att använda.
Jag har mekat så att den kan modulera pitchen nu.
Lyssningsprov med sågtand: http://www.sk-electronics.com/sk-synth/ ... _test4.mp3

Känns som att jag eventuellt skjutit mig lite i foten med att ha 100 steg mellan 2 noter eftersom det innebär att jag måste räkna om 0-127 => 0-100 hela tiden istället för att bara låta bitarna snurra runt av sig själva.
Anledningen till att jag vill ha 100 steg är att jag vill kunna "stämma" de 2 oscillatorerna med 1 cents upplösning och inte med ~0.79 cents upplösning, men jag vet inte om det har någon praktisk betydelse.
Som det är nu har jag disableat pitchbenden medans jag pillade med LFOn, så det återstår att lägga ihop pitchbenden med LFOn.
SEN ska jag äntligen börja pilla på filtren, vilket ska bli intressant.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: FPGA-baserad synth

Inlägg av Andax »

Fick några timmar över i helgen och gjorde ett "ljudkort" till evalkortet. Det består av en dual 12-bitars dac (MCP4822, 8-pin DIP med SPI-interface), två DC-blockande 100 µF elyter och en 3.5 mm stereokontakt. Allt monterat på ett experimentkort och med en vinklad 6-pol stiftlist så att det passar i diligent-kontakterna (J6 & J7). Total kostnad 40-50 spänn.

Har även testat det och det funkar. Gjorde en vhdl modul som tar in höger och vänster kanal-data 12 bitar och en strobe som startar SPI-överföringen till DAC-en.

Testade även att generera en sinus-signal mha av kod från Open Cores. Dock slösar denna implementation med blockram.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Kul att det går framåt för dig andax, jag har tankar på att göra en "poor mans" version av synthen i framtiden. Dvs en sådan som ska kunna köras på evalkortet med så litet extra komponenter som möjligt. Du hade väl planerat använda en 1-bits DAC mha PWM från början, var det någon speciell anledning till att du slopa den iden?

Här går det också framåt, ska försöka få ihop ett litet längre inlägg med statusrapport ikväll.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Nu börjar det bli ordning på filtret. Det är implementerat som ett biquad iir-filter, man kan styra två parametrar till filtret,
cutoff-frekvensen och resonansen (dvs förstärkning just där cutoff-frekvensen ligger).
För tillfället är bara ett LP12 filter implementerat och formeln som används är

y[n] = q*(b0*x[n] + b1*x[n-1] + b2*x[n-2] + a1*y[n-1] - 2*y[n-2]) + y[n-2]

dvs den så kallade "direkt form 1", fast lite ommöblerad för att få q (resonansen) som endast en variabel.

koefficienterna ligger lagrade i en lookuptabell med 128 positioner där värdena hämtas ut med avseende på frekvensen.
frekvensvärdena är lagrade exponentiellt för att få högre upplösning i de nedre regionerna.
För att räkna ut q värdet finns två värden lagrade i lookuptabellen, qmul och qmin dessa skalas sedan linjärt mha av qin som kan ha värdet 0-127.

En hel del förbättringar kan fortfarande göras, t.ex. så skalar jag alla koefficienter med 2^20, istället skulle det gå att skala varje inviduell koefficient med ett mer passande värde för just den koefficienten.

Hursomhelst en liten bild på spektrumet när alla noter spelats igenom. Cutoff-frekvensen är inställd på 380Hz och resonansen uppdragen en bra bit.
Bild

Sen ett obligatoriskt lyssningsprov, en liten truddelutt där jag sveper med cutoff-frekvensen:
http://www.sk-electronics.com/sk-synth/ ... _test5.mp3
Skriv svar