Mam jakiś dziwny problem z układem LFE5U-12F, albo ze środowiskiem Lattice Diamond.
Nie jestem specem od programowania układów programowalnych, ale zajmowałem się tym już z 7 lat temu i zrobiłem na tym kilka projektów (na CPLD).
Ze 3 miesiące temu po długiej przerwie zrobiłem na szybko kolejny układ (dość prosty, ale jednak) na CPLD Xilinxa i poszło bez żadnych problemów.
A teraz przysiadłem do FPGA Lattica (przy okazji mojego pierwszego projektu na FPGA) jest jakaś mega problem. Środowisko Lattice Diamond jest dla mnie strasznie niewygodne w obsłudze. Brakuje w nim wielu funkcjonalności które były w ISE Webpacku Xilinxa (albo są one gdzieś ukryte albo są niewygodne w obsłudze). Wy też tak oceniacie środowisko Lattica?
Więc nawet nie udało mi się przesymulować działania mojego kodu. Testuję od razu na żywo na układzie FPGA.
Układ jest bardzo prosty. (Prawie*) zwykły rejestr przesuwny z zatrzaskiem. Po wsunięciu 34 bitów danych, za pomocą sygnału STROBE dane te mają zostać zatrzaśnięte na 34-bitowym porcie wyjściowym.
*Problem tylko w tym że to jest rejestr działający na taktowaniu z wnętrza FPGA.
Rejestr ma sygnały CLK i STROBE, ale nie są one sygnałami zegarowymi. Są one jedynie próbkowane przez układ FPGA w takt jego wewnętrznego taktowania (podobno domyślnie 2.4MHz).
Kod:
I niestety układ nie działa stabilnie. Najstarsze bity nie zatrzaskują się poprawnie. Młodsze raczej poprawnie ale sporadycznie też się pojawiają błędy.
Wygląda to tak jakby układ gubił niektóre impulsy CLK (albo odbierał zakłócenia i traktował je jako dodatkowe impulsy CLK).
Sygnały sterujące generuję mikrokontrolerem, i na oscyloskopie wyglądają bardzo dobrze. Są czyste, mają ładne zbocza, stałą częstotliwość, itp. Problem nie wynika więc z tego że to mikrokontroler wysyła jakieś śmieci.
Działanie widać na 2 filmikach z załącznika (na pierwszym jest włączana dioda D1 (czyli druga najmłodsza licząc od początku), na drugim D1 i D32 (czyli dwie drugie od obu końców)). Łącznie wyjść jest 34, od D0 do D33.
Linia DIN też ma 3.3V. Zapomniałem przestawić podziałkę na oscyloskopie.
Kolejność diod na filmikach od lewej do prawej: D33, D1, D0, D32.
Zmieniałem Slew rate wysyłanego sygnału (choć FPGA ma wejścia ustawione na takie z histerezą więc nie powinno to mieć znaczenia) i nic to nie zmieniało w działaniu.
Kompletnie nie wiedziałem czego się czepić, więc dla testów dodałem sobie linię "test sygnału zegarowego" i sygnały przypisałem do 2 wolnych kulek wyprowadzonych jako testowe spod układu FPGA. I ku mojemu zdziwieniu nie ma na nich sygnału. Zgłupiałem kompletnie.
Zupełnie podobny kod (ale nie identyczny, np. taktowanie jest z pinu a nie z wnętrza układu) na CPLD Xilinxa działa bez problemów.
Pewnie popełniam jakiś podstawowy błąd ale nie wiem jaki i gdzie.
Jeszcze kilka informacji o sprzęcie żeby była jasność że tu raczej jest wszytko dobrze:
Nie jestem specem od programowania układów programowalnych, ale zajmowałem się tym już z 7 lat temu i zrobiłem na tym kilka projektów (na CPLD).
Ze 3 miesiące temu po długiej przerwie zrobiłem na szybko kolejny układ (dość prosty, ale jednak) na CPLD Xilinxa i poszło bez żadnych problemów.
A teraz przysiadłem do FPGA Lattica (przy okazji mojego pierwszego projektu na FPGA) jest jakaś mega problem. Środowisko Lattice Diamond jest dla mnie strasznie niewygodne w obsłudze. Brakuje w nim wielu funkcjonalności które były w ISE Webpacku Xilinxa (albo są one gdzieś ukryte albo są niewygodne w obsłudze). Wy też tak oceniacie środowisko Lattica?
Więc nawet nie udało mi się przesymulować działania mojego kodu. Testuję od razu na żywo na układzie FPGA.
Układ jest bardzo prosty. (Prawie*) zwykły rejestr przesuwny z zatrzaskiem. Po wsunięciu 34 bitów danych, za pomocą sygnału STROBE dane te mają zostać zatrzaśnięte na 34-bitowym porcie wyjściowym.
*Problem tylko w tym że to jest rejestr działający na taktowaniu z wnętrza FPGA.
Rejestr ma sygnały CLK i STROBE, ale nie są one sygnałami zegarowymi. Są one jedynie próbkowane przez układ FPGA w takt jego wewnętrznego taktowania (podobno domyślnie 2.4MHz).
Kod:
Code: vhdl
I niestety układ nie działa stabilnie. Najstarsze bity nie zatrzaskują się poprawnie. Młodsze raczej poprawnie ale sporadycznie też się pojawiają błędy.
Wygląda to tak jakby układ gubił niektóre impulsy CLK (albo odbierał zakłócenia i traktował je jako dodatkowe impulsy CLK).
Sygnały sterujące generuję mikrokontrolerem, i na oscyloskopie wyglądają bardzo dobrze. Są czyste, mają ładne zbocza, stałą częstotliwość, itp. Problem nie wynika więc z tego że to mikrokontroler wysyła jakieś śmieci.
Działanie widać na 2 filmikach z załącznika (na pierwszym jest włączana dioda D1 (czyli druga najmłodsza licząc od początku), na drugim D1 i D32 (czyli dwie drugie od obu końców)). Łącznie wyjść jest 34, od D0 do D33.
Linia DIN też ma 3.3V. Zapomniałem przestawić podziałkę na oscyloskopie.
Kolejność diod na filmikach od lewej do prawej: D33, D1, D0, D32.
Zmieniałem Slew rate wysyłanego sygnału (choć FPGA ma wejścia ustawione na takie z histerezą więc nie powinno to mieć znaczenia) i nic to nie zmieniało w działaniu.
Kompletnie nie wiedziałem czego się czepić, więc dla testów dodałem sobie linię "test sygnału zegarowego" i sygnały przypisałem do 2 wolnych kulek wyprowadzonych jako testowe spod układu FPGA. I ku mojemu zdziwieniu nie ma na nich sygnału. Zgłupiałem kompletnie.
Zupełnie podobny kod (ale nie identyczny, np. taktowanie jest z pinu a nie z wnętrza układu) na CPLD Xilinxa działa bez problemów.
Pewnie popełniam jakiś podstawowy błąd ale nie wiem jaki i gdzie.
Jeszcze kilka informacji o sprzęcie żeby była jasność że tu raczej jest wszytko dobrze:
Spoiler:
Płytka PCB jest 4-wartwowa. W warstwie wewnętrznej jest pole masy a przelotki są dobrane o takiej średnicy żeby pole masy je oblewało z każdej strony (tzn. żeby masa mimo przelotek nie była podzielona na niepodłączone ze sobą obszary):
Kondensatorów jest raczej dużo i są umieszczone bezpośrednio pod układem FPGA.
Każdy kondensator jest łączony z masą co najmniej dwoma przelotkami (czasami trzema):
Napięcia zasilania:
VCC: 1.1V
VCCAUX: 2.45V
VCCIO: 3.3V
Wszystkie napięcia sprawdzone multimetrem oraz oscyloskopem bezpośrednio na kondensatorach przy układzie FPGA. Mają wartości takie jak podane wyżej i są czyste (nie widać żadnych szpilek na nich).
Pobór prądu układów FPGA niewielki. Praktycznie w ogóle się nie grzeją.
Układ FPGA jest konfigurowany interfejsem Simple Serial, i przyjmuje dane (nie zgłasza błędu wsadu w trakcie programowania, a na koniec programowania potwierdza przyjęcie wsadu linią DONE).
100ms po skonfigurowaniu układu, a przed podawaniem sygnałów na linie CLK, DIN i STROBE, wysyłam jeszcze impuls na linię RST (impuls 10ms).
Dodam jeszcze że zmieniałem przypisanie sygnałów do kulek FPGA, i nic to nie zmienia w działaniu. Więc to raczej nie jest wina złego przylutowania układu (wykonanego zresztą nie przeze mnie ale zleconego specjalistycznej firmie).
No i problem występuje na 2 sztukach FPGA.

Kondensatorów jest raczej dużo i są umieszczone bezpośrednio pod układem FPGA.
Każdy kondensator jest łączony z masą co najmniej dwoma przelotkami (czasami trzema):

Napięcia zasilania:
VCC: 1.1V
VCCAUX: 2.45V
VCCIO: 3.3V
Wszystkie napięcia sprawdzone multimetrem oraz oscyloskopem bezpośrednio na kondensatorach przy układzie FPGA. Mają wartości takie jak podane wyżej i są czyste (nie widać żadnych szpilek na nich).
Pobór prądu układów FPGA niewielki. Praktycznie w ogóle się nie grzeją.
Układ FPGA jest konfigurowany interfejsem Simple Serial, i przyjmuje dane (nie zgłasza błędu wsadu w trakcie programowania, a na koniec programowania potwierdza przyjęcie wsadu linią DONE).
100ms po skonfigurowaniu układu, a przed podawaniem sygnałów na linie CLK, DIN i STROBE, wysyłam jeszcze impuls na linię RST (impuls 10ms).
Dodam jeszcze że zmieniałem przypisanie sygnałów do kulek FPGA, i nic to nie zmienia w działaniu. Więc to raczej nie jest wina złego przylutowania układu (wykonanego zresztą nie przeze mnie ale zleconego specjalistycznej firmie).
No i problem występuje na 2 sztukach FPGA.