Zkusím popsat svoje zkušenosti, byť malé.
Hrál jsem si s FPGA cca před deseti lety, takže situace se mohla značně zlepšit, přesto je asi dobré si dát pozor na to, co zmíním.
- vývojová prostředí pro FPGA byla mnohdy zadarmo, ale s omezenou funkčností, např. jen pro učitá, spíše malá FPGA.
- pro přístup k DRAM nebo PCI byly dostupné generované obvody, jak řekl předřečník, ale mám dojem, že to bylo placené, čili byste stejně asi potřeboval plné IDE, ne žádnou free verzi.
O vlastní implementeci přístupu k periferiím ani neuvažujte, jednak to nejde kvůli pomalosti, jednak je to absolutně pekelná práce, začátečníkem prakticky nezvládnutelná.
- profesionální FPGA pro výkon s taktem >500 Mhz budou drahá, až bych si místo nich radši koupil desku s několika výkonými x86 a programoval multicore ...
No a dále k algoritmu vašeho úkolu. Bylo by dobré si přečíst něco o tom, jak jsou FPGA implementovaná. Brzy zjistíte, že jakýkoli obvod sice na FPGA naimplementujete, ale některé operace využíjí extrémně mnoho zdrojů FPGA, takže se vám to custom CPU ani nevleze.
Levné operace jsou sčítání, odčítání, různé přesuny a výměny bitů. Násobení je už horší, ale jsou tam dedikované násobičky typu 16x16bitů (nebo o něco více). Pokud násobíte větší integery, kvadraticky vám poroste počet zkonzumovaných násobiček. A těch tam tolik zase není.
Dělení je samozřejmě nutné se obloukem vyhýbat, na to dedikovaný obvod není a sežere vám to kus FPGA.
Nepověděl jste nám, zda pracujete s celočíselnými daty nebo floating pointem.
Pokud chcete pracovat s floaty, ani o FPGA nepřemýšlejte. Jen implementace jednoduchého FPU vám sežere hrůznou část FPGA (tedy zejména malé FPGA).
Proto FPGA mívají dnes často dedikované třeba ARM jádro na běžnou logiku - implemnetovat i RISC CPU třeba sežere i celou FPGA. Vím, že nechcete implementovat celé vlastní CPU, ale píšu to jen pro ilustraci, jak rychle můžete vyplýtvat zdroje FPGA. A kromě jednoduchých operací vám budou docházet integrované bloky SRAM (např. na registry), přičemž k jednotlivým blokům interní SRAM je omezený počet paralelních přístupů (třeba dva).
Dále k vašemu algoritmu. Říkáte, že máte radši sériovou implementaci algoritmu, ale pak spíše naznačujete, že byste chtěl paralelní frontu (pipeline). Dobře si rozmyslete, zda dokážete algoritmus vyjádřit jako pipeline s mnoha kroky.
Čím více kroků, tím lépe - využijete paralelních schopností FPGA.
Pokud pipeline nebude dost hluboká, budete to mít pomalé, protože FPGA je na čistě sériové operace pomalá (vyplývající z frekcence v řádu stovek MHZ, a toho, že na jeden takt frekvence toho mnoho nespočítáte).
Pokud tedy nemáte algoritmus, který počítá jen v integerech a fikaně nakládá s bity a je dobře paralelizovatelný do hlubokých pipeline, myslím, že si nepolepšíte a budete nepříjemně překvapen.
Na obecnou akcelaraci výpočtů bych skutečně radši nakoupil GPU nebo slušné desktopvé/serverové CPU.
FPGA dokáže urychlit jen určité, správně napsané algoritmy. Není vhodné to použít jako generalizovaný akcelerátor algoritmu, který jste si někde nachystal v C ...