.. _basys2: ========================== Instrukcje uĹźywania pĹytki ========================== .. toctree:: .. contents:: O pĹytce ======== PĹytka Basys 2 ma nastÄpujÄ cy sprzÄt: 1. UkĹad FPGA Xilinx Spartan 3E, model XC3S100E w obudowie CP132, speed grade 4, zakres temperatur C (i takie parametry naleĹźy wybraÄ w ISE). 2. UkĹad Xilinx platform flash XCF02S, pozwalajÄ cy na zapisanie konfiguracji FPGA. 3. WĹÄ cznik zasilania. 4. Mikrokontroler AVR obsĹugujÄ cy port USB, umoĹźliwiajÄ cy programowanie FPGA oraz platform flash, a takĹźe komunikacjÄ z pĹytkÄ przez protokóŠEPP. 5. ZworkÄ wybierajÄ cÄ uruchomienie FPGA z platform flash bÄ dĹş czekanie na zaprogramowanie bezpoĹrednio przez USB. 6. 8 przeĹÄ cznikĂłw ogĂłlnego przeznaczenia. 7. 4 przyciski ogĂłlnego przeznaczenia. 8. 8 diod ogĂłlnego przeznaczenia. 9. 4-cyfrowy wyĹwietlacz 7-segmentowy. 10. 4 zĹÄ cza PMod (moĹźna do nich podĹÄ czyÄ moduĹy z dodatkowÄ funkcjonalnoĹciÄ ). 11. Oscylator ok. 50MHz (doĹÄ niedokĹadny). 12. Miejsce na wĹoĹźenie lepszego oscylatora (ktĂłrych mamy 5 sztuk). 13. Port VGA. 14. Port PS/2, umoĹźliwiajÄ cy podĹÄ czenie klawiatury bÄ dĹş myszy. Dokumentacja pĹytki: https://reference.digilentinc.com/reference/programmable-logic/basys-2/reference-manual Przypisania pinĂłw ================= Aby wejĹcia/wyjĹcia naszego kodu zostaĹy poprawnie przypisane do wyprowadzeĹ ukĹadu FPGA, potrzebujemy pliku :download:`basys2.ucf`, w ktĂłrym jest opisane mapowanie. Niestety, przed uĹźyciem tego pliku naleĹźy go zmodyfikowaÄ tak, Ĺźeby odkomentowane byĹy te wyprowadzenia, ktĂłrych uĹźywamy (niestety, ISE zgĹasza bĹÄ d, gdy w ``.ucf`` jest mapowanie dla nieuĹźywanego wyprowadzenia, ale nie zgĹasza bĹÄdu, gdy mamy w Verilogu niezmapowane wejĹcie/wyjĹcie -- wybiera wtedy losowo wyprowadzenie). Maszyna wirtualna ================= Na stacjach laboratoryjnych mamy przygotowany obraz maszyny wirtualnej z caĹym potrzebnym oprogramowaniem. Aby go uĹźyÄ, naleĹźy: 1. UtworzyÄ swĂłj wĹasny obraz dysku, jako obraz copy-on-write bazowany na obrazie wzorcowym (tylko raz):: qemu-img create -f qcow2 -o backing_file=/home/dokstud/mwk/pul2018.qcow2 pul2018_cow.qcow2 2. UtworzyÄ katalog wspĂłĹdzielony (raz):: mkdir pul2018-share 3. UruchomiÄ qemu:: qemu-system-x86_64 -enable-kvm -drive file=pul2018_cow.qcow2,if=virtio -usb -net nic,model=virtio -net user -m 1G -fsdev local,id=pul2018-share,path=pul2018-share/,security_model=none -device virtio-9p-pci,fsdev=pul2018-share,mount_tag=pul2018-share -device usb-host,vendorid=0x1443,productid=0x0007 -display sdl Na obrazie maszyny zainstalowany jest Debian oraz nastÄpujÄ ce narzÄdzia: - Xilinx ISE - Digilent Adept utilities - Yosys - Icarus verilog (aka iverilog) - Verilator MoĹźna siÄ zalogowaÄ nazwÄ uĹźytkownika ``pul`` z hasĹem ``pul``. W ``/mnt/share`` bÄdzie widoczna (do odczytu i zapisu) zawartoĹÄ katalogu wspĂłĹdzielonego ``pul2018-share`` z hosta. JeĹli chcemy uĹźyÄ tego obrazu na wĹasnej maszynie, naleĹźy pamiÄtaÄ o zapewnieniu qemu dostÄpu do odpowiedniego urzÄ dzenia USB (plik ``/dev/bus/usb/<szyna>/<adres>``). .. Ĺťeby zmieniÄ rozdzielczoĹÄ ekranu w maszynie wirtualnej:: .. xrandr --output Virtual-0 --mode 1920x1080 Od Veriloga do bitstreamu ========================= PrzykĹadowe pliki: - :download:`abc.v` (ĹşrĂłdĹo w Verilogu) - :download:`abc.ucf` (mapowanie wejĹÄ/wyjĹÄ na fizyczne wyprowadzenia) Musimy napisaÄ dwa pliki sterujÄ ce pracÄ xst. W pliku ``abc.prj`` umieszczamy listÄ plikĂłw w projekcie:: verilog work "abc.v" W pliku ``abc.xst`` umieszczamy listÄ poleceĹ sterujÄ cych syntezÄ :: run -ifn abc.prj -p xc3s100e-4-cp132 -top abc -ofn abc Ĺťeby otrzymaÄ plik .bit naleĹźy wykonaÄ nastÄpujÄ ce komendy:: # Synteza (.v -> .ngc) xst -ifn abc.xst # Linkowanie (.ngc -> .ngd) ngdbuild abc -uc abc.ucf # TĹumaczenie na prymitywy dostÄpne w ukĹadzie Spartan 3E (.ngd -> .ncd) map abc # Place and route (.ncd -> lepszy .ncd) par -w abc.ncd abc_par.ncd # Generowanie finalnego bitstreamu (.ncd -> .bit) bitgen -w abc_par.ncd -g StartupClk:JTAGClk Opcja ``-g StartupClk:JTAGClk`` wybiera uruchomienie FPGA uĹźywajÄ c sygnaĹu zegarowego z programatora (uĹźywane przy bezpoĹrednim programowaniu FPGA). W przypadku uruchamiania FPGA z koĹci platform flash, naleĹźaĹoby uĹźyÄ ``-g StartupClk:CCLK``. Na koniec otrzymujemy plik ``abc_par.bit``. JeĹźeli chcemy siÄ przyjrzeÄ wynikowi syntezy (zobaczyÄ prymitywy uĹźyte przez syntezator), moĹźemy uĹźyÄ polecenia ``ngc2edif``, by otrzymaÄ netlistÄ w tekstowym formacie EDIF. Programowanie ukĹadu FPGA ========================= UkĹad FPGA moĹźe uruchamiaÄ siÄ z konfiguracji zapisanej w platform flash, bÄ dĹş bezpoĹrednio z portu USB. Na zajÄciach bÄdziemy uĹźywaÄ uruchamiania z portu USB. W pamiÄci platform flash jest zapisany (i powinien pozostaÄ tam zapisany) bitstream diagnostyczny, pozwalajÄ cy na przetestowanie funkcjonalnoĹci pĹytki. Polecenie do przesĹania pliku ``.bit`` bezpoĹrednio do ukĹadu FPGA uĹźywajÄ c narzÄdzi producenta to:: djtgcfg -d Basys2 prog -i 0 -f abc_par.bit Alternatywnie, moĹźna uĹźyÄ otwartego narzÄdzia (https://github.com/koriakin/adepttool):: ./basys2_prog.py abc_par.bit SprzÄt na pĹytce ================ Diody, przeĹÄ czniki, przyciski ------------------------------ Mamy 8 diod, ``led[7:0]``. Wyprowadzenia powinny odpowadaÄ ``output``-om w Verilogu. Dioda Ĺwieci, jeĹli na wyjĹciu jest stan 1. Mamy 8 przeĹÄ cznikĂłw, ``sw[7:0]``. Powinny odpowiadaÄ ``input``-om w Verilogu. PrzeĹÄ cznik przeĹÄ czony w gĂłrÄ daje stan 1, przeĹÄ czony w dóŠdaje stan 0. Mamy 4 przyciski, ``btn[3:0]``. Przycisk naciĹniÄty daje stan 1, nienaciĹniÄty daje stan 0. Zegary ------ Mamy dwa zegary: ``mclk`` oraz ``uclk``. ``mclk`` jest podĹÄ czony do oscylatora na pĹytce, generujÄ cego sygnaĹ o czÄstotliwoĹci mniej-wiÄcej 50MHz. ``uclk`` jest podĹÄ czony do gniazdka na lepszy oscylator i musimy tam taki oscylator wĹoĹźyÄ, Ĺźeby go uĹźyÄ. Mamy do dyspozycji 2 sztuki oscylatora 32Mhz oraz 2 sztuki oscylatora 20MHz. WyĹwietlacz 7-segmentowy ------------------------ Mamy 4-cyfrowy wyĹwietlacz 7-segmentowy. WyĹwietlacz jest sterowany za pomocÄ 4 anod (``an[3:0]``, po jednej na kaĹźdÄ cyfrÄ) oraz 8 katod (po jednej na kaĹźdy z siedmiu segmentĂłw -- ``seg[6:0]`` oraz jedna na kropkÄ -- ``dp``). Dany segment wyĹwietlacza Ĺwieci siÄ, gdy na odpowiadajÄ cej katodzie i anodzie jest jednoczeĹnie stan logiczny 0. Nie moĹźemy wiÄc w danym momencie wyĹwietlaÄ kilku róşnych cyfr. Ĺťeby obejĹÄ to ograniczenie, naleĹźy skonstruowaÄ ukĹad synchroniczny zmieniajÄ cy co jakiĹ czas (na skali setek mikrosekund) aktualnie wyĹwietlanÄ cyfrÄ. KaĹźda cyfra bÄdzie ĹwieciĹa 4 razy ciemniej niĹź teoretyczne maksimum, ale nie jest to problemem w praktyce. Segmenty sÄ nastÄpujÄ ce: - 0: gĂłrny poziomy - 1: prawy gĂłrny pionowy - 2: prawy dolny pionowy - 3: dolny poziomy - 4: lewy dolny pionowy - 5: lewy gĂłrny pionowy - 6: Ĺrodkowy poziomy Wzorce bitowe dla poszczegĂłlnych cyfr i innych wyĹwietlalnych znakĂłw (najwyĹźszy bit to segment 6): - 0 lub O: ``7'h40`` - 1 lub I: ``7'h79`` - 2: ``7'h24`` - 3: ``7'h30`` - 4: ``7'h19`` - 5: ``7'h12`` - 6: ``7'h02`` - 7: ``7'h78`` - 8: ``7'h00`` - 9: ``7'h10`` - A: ``7'h08`` - b: ``7'h03`` - c: ``7'h27`` - C lub [: ``7'h46`` - d: ``7'h21`` - E: ``7'h06`` - F: ``7'h0e`` - h: ``7'h0b`` - H: ``7'h09`` - J: ``7'h71`` - L: ``7'h47`` - o: ``7'h23`` - P: ``7'h0c`` - q: ``7'h18`` - u: ``7'h63`` - U: ``7'h41`` - ]: ``7'h70`` - -: ``7'h3f`` - _: ``7'h77`` - spacja: ``7'h7f`` MoĹźemy wyĹwietlaÄ cyfry bezpoĹrednio po sobie, ale spowoduje to lekkie "przeciekanie" cyfr miÄdzy sobÄ (ze wzglÄdu na czas potrzebny na propagacjÄ sygnaĹĂłw przez oporniki na pĹytce). Nie jest to zbyt powaĹźny problem, ale jeĹli nam on przeszkadza, polecam nastÄpujÄ cÄ procedurÄ: 1. Przez 1024 cykle zegara: wystawiamy 1 na wszystkich anodach, wystawiamy segmenty cyfry X na katodach (Ĺadujemy katody). 2. Przez 14336 cykle zegara: wystawiamy 0 na anodzie cyfry X, 1 na pozostaĹych anodach, wystawiamy segmenty cyfry X na katodach (wyĹwietlamy cyfrÄ). 3. Przez 1024 cykle zegara: wystawiamy 1 na wszystkich anodach, dalej trzymamy segmenty cyfry X na katodach (pozwalamy anodzie siÄ rozĹadowaÄ). 4. Zmieniamy cyfrÄ na kolejnÄ , wracamy do punktu 1. Podane czasy sÄ tylko orientacyjne -- moĹźna je spokojnie zmieniÄ o rzÄ d wielkoĹci w gĂłrÄ bÄ dĹş w dĂłĹ. Klawiatura/mysz PS/2 -------------------- ObsĹuga klawiatury i myszy PS/2 opisana jest tu: :ref:`ps2`. Na pĹytce mamy sygnaĹy ``PS2D`` (dane) i ``PS2C`` (zegar) podĹÄ czone do zĹÄ cza PS/2 przez prosty konwerter napiÄÄ. Monitor VGA ----------- ObsĹuga monitora VGA opisana jest tu: :ref:`vga`. Na pĹytce mamy wyprowadzone bezpoĹrednio sygnaĹy ``HSYNC`` i ``VSYNC`` ze zĹÄ cza VGA, natomiast sygnaĹy ``R``, ``G`` i ``B`` sÄ podĹÄ czone przez prosty konwerter cyfrowo-analogowy (3 bity na ``R`` i ``G``, 2 bity na ``B``). ZĹÄ cza PMod ----------- PĹytka ma 4 zĹÄ cza PMod sĹuĹźÄ ce do podĹÄ czania moduĹĂłw rozszerzajÄ cych jej funkcjonalnoĹÄ. ZĹÄ cza nazywajÄ siÄ (od lewej) JA, JB, JC, JD. KaĹźde zĹÄ cze ma 6 pinĂłw (od lewej): - ``Jx1``: programowalne, naleĹźy skonsultowaÄ siÄ z dokumentacjÄ moduĹu. - ``Jx2``: j/w - ``Jx3``: j/w - ``Jx4``: j/w - ``GND``: masa, 0V - ``VCC``: zasilanie, 3.3V Na chwilÄ obecnÄ nie mamy Ĺźadnych moduĹĂłw PMod, ale mamy dwa kable USB<->UART, ktĂłre moĹźemy podĹÄ czyÄ do zĹÄ cza PMod za pomocÄ drutĂłw. Komunikacja z komputerem (EPP) ============================== ObsĹuga portu EPP opisana jest tu: :ref:`epp`.