Wpis z mikrobloga

#fpga #elektronika

Mam tutaj taki program złożony z dwóch modułów:

1. Countera
2. Rejestru przesuwnego

Działa on tak:

1. Układ startuje, counter liczy takty.
2. Gdy counter nabije 128 następuje załadowanie wartości z niego do rejestru przesuwnego.
3. Gdy na counterze mamy 128 lub mniej to przesuwanie ma być logiczne, jeśli jest powyżej 128 to arytmetyczne.
4. Counter liczy dalej, shifter przesuwa.

A teraz gdzie jest problem:

Rozjeżdża się synchro w układzie i teraz zastanawiam się jak VHDL rozumie procesy. Bo jak widzicie są dwa procesy zależne od tych samych parametrów i nie wiem jak on to rozumuje.

Ogółem zapakowanie danych do shiftera następuje po 130 taktach a nie po 128 czy nawet 129. Więc w efekcie w rejestrze mamy wartość 10000001. Jak się tego pozbyć?

http://pastebin.com/SxypsPq8
  • 2
Odkryłem przyczynę, napiszę o co chodziło dla przyszłych pokoleń:

Żeby to działało w synchronizacji trzeba mieć w zachowaniu układu umieszczone warunki współpracy pomiędzy modułami, a nie w procesach. Tutaj sterowanie było z countera (jakby zdarzenia wewnątrz countera), co jak widać VHDL rozumie inaczej niż byśmy chcieli.

Wystarczyło takie coś dać poza oba procesy i pojawiła się synchronizacja. Można też dać jakieś ify tutaj ewentualnie.

iLOAD <= '1' when iDANE = "10000000" else