FPGA ir sinchronizacijos problemos

Įrašyta 2010-02-01, 22:53 | 2 Komentarai

Pasirašiau kodą savo NES adapteriui, pratestavau - viskas lyg ir veikė, tačiau kai atėjo laikas prijungti interfeisą prie žaidimo kodo, susidūriau su problemomis. Erdvėlaivis, kuris turi judėti į šonus, kartais užstringa.

Pradžiai šiek tiek informacijos. Kaip minėjau, Nintendo pultai naudoja serijinę komunikaciją. Su šia dalim viskas tvarkoj - susirenku bitus į baitą ir pateikiu jį išėjime. Valdymo pultams pateikiu 800Hz taktinį dažnį, taigi mygtukų reikšmes gaunu šimtą kartų per sekundę.

Spartan-3E plokštė darbui naudoja 50MHz dažnį, todėl kiekvieno spustelėjimo metu erdvėlaivis pasislenka į šoną per maždaug 60k pikselių. Reikėjo būdo šį skaičių sumažinti. Tam panaudojau skaičiuoklį (counter):

position_next <= position + 1 when (nes1_right = '1' and move_counter = 0) else
                 position - 1 when (nes1_left = '1' and move_counter = 0) else
                 position;

Kodas tvarkingas, aplink esantis kodas irgi veikė, tačiau kartas nuo karto erdvėlaivio judėjimas sustodavo, o po trumpos pauzės vėl veikdavo. Teko šiek tiek palaužyt galvą, kol supratau kur bėda. Įtarimo patvirtinimui, prijungiau osciloskopą ir pamačiau štai ką:

Teks spręst šią problemą tvarkingai ir montuot kokį edge-detector.

Gairės: Debugging, FPGA