Programowanie wielu układów FPGA za pomocą JTAG

9

Mam łańcuch JTAG łączący 4 układy FPGA Spartan 6, które programuję za pomocą ISE iMPACT. Oprogramowanie może pomyślnie zaprogramować dowolny ścisły podzbiór 4 układów FPGA w dowolnej kolejności. Jednak gdy próbuję zaprogramować wszystkie cztery układy FPGA, styk DONE ostatniego układu FPGA nie przechodzi w stan wysoki, a programowanie kończy się niepowodzeniem.

Co może być przyczyną tego dziwnego zachowania?

Uwagi:

  1. Po zaprogramowaniu trzech FPGA bit INIT_B rejestru stanu dla czwartej FPGA ma wartość 0, chociaż pin INIT_B jest wysoki. Tuż przed zaprogramowaniem trzeciego układu FPGA bit ten wynosił 1. To sugeruje, że czwarty układ FPGA został zamknięty.
  2. Podczas programowania w SelectMap mogę bez problemu zaprogramować wszystkie cztery układy FPGA.
  3. Kiedy programuję trzy układy FPGA za pomocą SelectMap, czwartego nadal nie można zaprogramować za pomocą JTAG.
  4. Każdy z czterech wykonanych pinów jest podciągany do 3V3 przez rezystory 4,7K Ohm, a następnie wiązany ze sobą.

Rzeczy, których próbowałem :

  1. Odłączenie jednego z układów FPGA od łańcucha pozwala na zaprogramowanie pozostałych 3 układów FPGA.

  2. Zamiana rezystora podciągającego 4,7 kOm z ostatniego układu FPGA na rezystor 330 omów nie rozwiązuje problemu.

Randomblue
źródło
2
Co rozumiesz przez „ostatnią FPGA”? Ponieważ w instrukcji obsługi jest napisane "The first device in a serial daisy chain is the last to be configured."Czy masz na myśli ostatni w łańcuchu czy ostatni do skonfigurowania (pierwszy w łańcuchu)? Czy możesz podać schemat?
embedded.kyle
2
To stwierdzenie na p59 każe mi myśleć inaczej,"If the Spartan-6 device is configured via JTAG, the configuration instructions occur independent from the mode pins."
embedded.kyle
Po zapoznaniu się z instrukcją obsługi (minęło około 6 miesięcy, odkąd wykonałem pracę z FPGA), jestem trochę zdezorientowany twoją terminologią. Daisy Chain jest używany w połączeniu z programowaniem szeregowym. W takim przypadku DONEszpilki są ze sobą powiązane. W przypadku JTAG programowanie wielu urządzeń nazywa się łańcuchem skanowania granic. W Chapter 3: Boundary-Scan and JTAG Configuration, jedyną wzmianką o DONEszpilce jest "If JTAG is the only configuration mode, then PROGRAM_B, INIT_B, and DONE can be tied High to a 330 resistor."Więc czy DONEszpilka jest jedynym problemem? Czy programuje się poprawnie?
embedded.kyle
niech nam kontynuować tę dyskusję w czacie
embedded.kyle
Myślę, że fakt, że możesz zdobyć 3, ale nie 4, jest wskazówką. Sprawdź Rozdział 4 Przewodnika programisty JTAG na temat projektowania systemów skanowania granicznego: xilinx.com/support/sw_manuals/2_1i/download/jtag.pdf
embedded.kyle

Odpowiedzi:

6

DONEPin nie jest używany podczas programowania JTAG i może być związany wysokie:

Jeśli JTAG jest jedynym trybem konfiguracji, wówczas PROGRAM_B, INIT_B i GOTOWE można powiązać High z rezystorem 330Ω. (p57)

Jeśli jednak używane jest programowanie szeregowe, wszystkie DONEpiny powinny być powiązane i DriveDonepowinny być wyłączone dla wszystkich urządzeń z wyjątkiem pierwszego:

Ważne jest, aby podłączyć styki WYKONANE dla wszystkich urządzeń w szeregowym łańcuchu połączeń. Niepodłączenie styków DONE może spowodować błąd konfiguracji. (p135)

Wszystkie urządzenia oprócz pierwszego powinny wyłączyć sterownik na pinie WYKONANE. (p135)

Jeśli mają być użyte oba, istnieją dwie opcje:

Alternatywnie, sterownik można wyłączyć dla wszystkich styków DONE i można dodać zewnętrzny rezystor podciągający, aby wyciągnąć sygnał High po zwolnieniu go przez wszystkie urządzenia. (p135)

Do celów debugowania często pomocne jest rozłączenie poszczególnych styków DONE ze wspólnego sygnału DONE, aby urządzenia można było indywidualnie konfigurować za pomocą interfejsu szeregowego lub JTAG. (p135)

W twoim przypadku myślę, że DONEnajlepszym sposobem jest połączenie ich i związanie ich wysoko przy wyłączeniu pinów.

Wszystkie numery stron odnoszą się do Podręcznika użytkownika

embedded.kyle
źródło
Hmmm ... Jeśli byłeś INIT_Bwysoki, a INIT_Bbit w rejestrze stanu ma wartość 0, oznaczałoby to awarię sprzętu. Chyba że możesz zaprogramować ten układ niezależnie, co według mnie powiedziałeś, że możesz. DONEPin idzie wysokie-Z podczas programowania, więc nie wiem, co rejestr stanu robi w tym momencie. Jeśli LSB poprzedniego rejestru statusu FPGA wynosi 1, oznacza to błąd CRC w tym urządzeniu, który może uniemożliwić zaprogramowanie następnego.
embedded.kyle
Znaleziono problem (zobacz moje rozwiązanie). Dziękuję za pomoc
Randomblue
3

Okazało się, że winowajcą była INIT_Bszpilka. Mimo wysokiego wyciągnięcia, gdy zaprogramowano kilka pierwszych układów FPGA, INIT_Bpin był stopniowo wyciągany coraz niżej z powodu wewnętrznego opuszczania.

Po zaprogramowaniu trzech układów FPGA, INIT_Bpin został pociągnięty wystarczająco nisko, aby czwarty układ FPGA mógł interpretować INIT_Bjako niski poziom logiczny, uniemożliwiając w ten sposób zaprogramowanie czwartego FGPA za pomocą JTAG.

Randomblue
źródło
Dziękujemy za udostępnienie głównej przyczyny. Sprawdzałem to pytanie, aby uzyskać odpowiedź, ponieważ było to takie dziwne zachowanie. Jakie było rozwiązanie problemu? Silniejszy pullup niż 330Ω?
embedded.kyle
Okazuje się, że istnieją opcje bitgenów, które określają, że INIT_Bpin należy podciągnąć w górę zamiast w dół po programowaniu.
Randomblue