FPGA’s in C met Cynth

FPGA’s in C met Cynth

Programmeren van een FPGA met Verilog ziet er veel uit als programmeren. Het is echter niet, althans niet in de conventionele zin. Er zijn een aantal systemen geweest die het doel hebben om C-code te nemen en om te zetten in een hardwarebeschrijvingstaal. Een van deze, Cynth, is gemakkelijk te gebruiken en aangeboden op GitHub. U verplaatst zich om Scala op te zetten, evenals een ontwikkelsysteem genaamd SBT, als u het wilt proberen.

Er zijn natuurlijk beperkingen. Als u een preprocessor wilt, moet u het afzonderlijk uitvoeren. Je kunt geen wereldwijde variabelen, vermenigvuldiging, drijvers gebruiken, evenals talloze andere stukjes C. De compiler produceert een verilog-gegevens voor elke C-functie.

Een conventioneel C-programma voert één ding uit elke keer, tenzij u speciale methoden op een multiprocessor gebruikt. Zelfs dan is er een nuttige limiet voor precies hoe talloze CPU’s u waarschijnlijk controleert. Een FPGA, aan de andere kant, kunt u dingen uitvoeren die parallel gebeurt. Denk hier bijvoorbeeld over na:

terwijl (1)
{
out1 = ctr1 ++;
Out2 = CTR2 ++;
}
De OUT1-waarde gaat een beetje voor de waarde in OUT2 wijzigen. Als u veel van deze had, staat u zoveel als OUT999, de vertraging is mogelijk significant. Equivalente verilogcode kan eruit zien:

altijd @ (POSEGE CLK)
beginnen
OUT1 <= CTR1; CTR1 <= CTR1 + 1; uit2 <= Ctr2; CTR2 <= CTR2 + 1; einde Dit ziet er vrijwel hetzelfde uit, maar de uitgangen zullen op exact dezelfde tijd modificeren, ongeacht hoe ze er ook zijn. Wat nog veel meer is dat alle andere dingen die je niet kunt zien, ook op exact dezelfde keer optreden. Net als een hardware en ingang zijn de ingangen niet "scannen", verwerkt een FPGA alle ingangen en produceert de uitgangen. In de situatie van Cynth produceert elke C-functie een Verilog-module die exact dezelfde argumenten heeft als de functie samen met nog een meningsverschil om in te staan ​​voor de retourwaarde, indien aanwezig. Er zullen eveneens input zijn voor de systeemklok, een reset-signaal, evenals drie beherende signalen. Een is een input waarmee de verwerking mogelijk is. Er zijn twee uitgangen. Men geeft aan dat de functie wordt aangeboden om en nog een meer aangeeft dat er een resultaat beschikbaar is. Het voorbeeld dat bij de Code wordt aangeboden, is een cylon oogpatroon dat vier LED's aandrijft. Er zijn twee externe functies die worden geproduceerd met Pure Verilog. De Write_LEDS-functie drijft de LED's en een slaapfunctie creëert een vertraging. De C-code is een eenvoudige functie met de naam Roving: terwijl (1) { if (dir && c == 8) DIR = 0; anders if (! DIR && C == 1) DIR = 1; if (dir) C << = 1; anders c >> = 1;

Write_LEDS (C);

Slaap (1000); // 1s
}
De bijbehorende veriloggegevens voeren exact dezelfde functie uit zoals u kunt bevestigen met behulp van een verilog-emulator.

Als u in de geproduceerde code wilt graven, kunt u veel meer over Verilog ontdekken met sommige projecten. Als C niet jouw ding is, kun je altijd Python proberen.

Leave a Reply

Your email address will not be published. Required fields are marked *