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

2 Komentarai

Socrates

1. Socrates

2010-02-06, 21:59

O paleist papildoma counteri ir pagal ji sinchronizuot nera noro? :)

Armandas

2. Armandas

2010-02-07, 11:22

Nežinau, manau, kad turėjo užtekt to vieno counterio. Nelabai numanau, iš kur tas nesutapimas atsirado išvis. Vienas signalas turėjo būt 100Hz, kitas 1kHz.. Išsprendžiau laikydamas duomenų baitą 20ns (1 clk).