====== Přípravek MicroZed APO ====== Tato stránka obsahuje podrobný popis hardware a periferií připravených pro cvičení a semestrální úlohy. Návody jak se se k přípravku připojit naleznete na stránce [[..:mz_apo-howto:start|Nápověda k práci s přípravkem MicroZed APO]]. ==== Popis hardware použité procesorové desky MicroZed ==== * MICROZED EVALUATION KIT * ADSAES-Z7MB-7Z010-G * XilinX Zynq 7Z010 * Základní čip: Xilinx Zynq-7000 All Programmable SoC * Typ: Z-7010, součástka XC7Z010 * CPU: Dual ARM® Cortex™-A9 MPCore™ @ 866 MHz (NEON™ & Single / Double Precision Floating Point) * 2x L1 32 kB data +32 kB instruction, L2 512 KB * FPGA: 28K Logic Cells (~430K ASIC logic gates, 35 kbit) * Výpočetní jednotky v FPGA: 100 GMACs * Paměti v FPGA: 240 KB * Paměť na desce MicroZed: 1GB * Operační systém: GNU/Linux * GNU LIBC (libc6) 2.28-10 * Jádro Linux 4.19.59-rt22-00005-gedf9096397ae [[https://github.com/ppisa/linux-kernel/tree/linux-4.19.y-pi|src]] * Distribuce: Debian 10 Buster * Více informací na stránce výrobce * https://www.avnet.com/wps/portal/us/products/avnet-boards/avnet-board-families/microzed/ Rozhraní přístupná přímo na desce MicroZed * 1G ETHERNET, * USB Host, konektor A * sériový port UART1 přes převodník na USB, USB mikro-B * mikro SD karta * na desce je Flash, jedna uživatelská LED, uživatelské tlačítko a reset tlačítko ==== Popis rozhraní vývojového kitu MZ_APO ==== Na výukovém modulu jsou vyvedené v logickém návrhu obsloužené následující periferie * malý paralelní LCD display, zatím přístup jen přes command a data register * v FPGA lze implementovat automat na zobrazení z framebufferu * 32 LED diod pro zobrazení 32-bit slova (připojení k FPGA je přes SPI) * dva RGB LED indikátory (připojení SPI) * tři rotační ovládací vstupy (IRC) s vyvedenými fázově posunutými signály a kontaktem na stisknutí (připojení přes SPI) * čtyři výstupy na modelářská serva, signál a napájeni 5V výstupy jsou přímo připojené na FPGA a doplněné LED diodami dva lze použít i pro připojení 5V PS2 klávesnice * audiovstup na převodník v Zynqu, ten má interface do ARM části, ale lze ho sběrnicí připojit i do FPGA Programmable Logic. Na desce je osazený malý mikrofon, při zapojení externího do 3.5 mm červeného JACKa dojde k přepnutí na vnější vstup, jumperem lze nastavit ze zesíleného na klasický 1V linkový standard * audio výstup, pouze PWM přímo z FPGA PL, ale při vhodné modulaci lze přehrát i melodii. Na desce je přilepený malý reproduktor s možností přepnutí na sluchátka po zapojení do JACK (pouze mono výstup) * 2x PMOD konektor, jedná se o de-facto standard pro připojení pomalých (max. desítky MHz) periferií k FPGA, na každém je vyvedeno 8 FPGA PL signálů, napájení +3.3V a navíc jsou přidané piny pro napájení +5V, s tím že +5V lze odpojovat jumperem. Při zkratu do 3.3 logických signálů hrozí zničení. Není přímo použitý standard PMOD konektoru, který na straně FPGA používá samičku. Důvod je možnost snadného připojení na plochý kabel. Krátkou spojkou je možné zařídit redukci přímo na interface kompatibilní s dostupnými PMOD periferiemi. * 1x 40 pin konektor s 36 FPGA 3.3V signály. Odpovídá rozložení signálů na výukových deskách Altera DE2. Část signálů je vedena s ohledem na použitelnost pro rychlé LVDS spojení. Druhá půlka je sdílená s PMOD výstupy. Vyvedené je napájení +3.3V a jumerem připojovaných +5V. * 2x rozhraní pro připojení 10-bit paralelních kamer. * dva kanály pro připojení CAN sběrnic, budiče do 5 MBd připojení přes FPGA PL buď na integrované kontroléry nebo na radiče v FPGA, ty by bylo možné implemntovat v rámci nějakého projektu s podporou CAN-FD * zdroj pro napájení 5.5 mm JACKem z 12 až 24 VDC. * na konektor USB B je připojený čip FTDI, který obstarává přístup na sériovou konzoli směrovanou na UART0 obvodu Zynq. Vlastní signály obvodu Zynq a napájení kitu jsou konektoru a signálů USB galvanicky oddělené. S volbou nastavení konzole na piny MIO10 a MIO11 byla upravená a skompilovaná vlastní verze zavaděče {{http://www.denx.de/wiki/U-Boot|U-Boot}}. Zkompilované bylo na míru jádro operačního systému Linux. * při použití UART0 přes převodník FTDI, je možné signálem break aplikovaným po dobu delší než 1s desku resetovat. * dvoupinový konektor pro externí reset, například relátkem při použití pro vzdálený přístup a ladění aplikací * návrh hardware Ing. Petr Porazil ve firmě PiKRON s.r.o. Kompletní mechanický návrh a návrh elektroniky kitu je k dispozici v GIT repozitáři [[https://gitlab.com/pikron/projects/mz_apo/microzed_apo]] Pro zobrazení a editaci mechanického návrhu je potřeba nainstalovat program FreeCAD [[https://freecadweb.org/]] Pro zobrazení a editaci schémat a pložného spoje pak návrhový systém Ing. Petra Porazila - PEDA [[https://sourceforge.net/projects/peda/]] === Tabulka bázových adres jednotlivých periferií === ^ Fyzická \\ adresa ^ Rozsah ^ Symbolické označení ^ Popis ^ | 0x43c40000 | 0x4000 | SPILED_REG_BASE_PHYS | Blok periferií, otočných voličů, maticové klávesnice a RGB LED | | 0x43c00000 | 0x4000 | PARLCD_REG_BASE_PHYS | Paralelní LCD display | | 0x43c50000 | 0x4000 | SERVOPS2_REG_BASE_PHYS | Řízení až čtyř modelářských serv, alternativně PS2 | | 0x43c60000 | 0x4000 | AUDIOPWM_REG_BASE_PHYS | Jednoduchý audio výstup (zatím jen PWM) | | 0x43c20000 | 0x4000 | DCSPDRV_REG_BASE_PHYS_0 | Periferie pro řízení prvního stejnosměrného motorku | | 0x43c30000 | 0x4000 | DCSPDRV_REG_BASE_PHYS_1 | Periferie pro řízení druhého stejnosměrného motorku | === Blok otočných voličů, maticové klávesnice a RGB LED === Sada registrů začíná na fyzické adrese SPILED_REG_BASE_PHYS ^ Ofset registru ^ Symbolické označení ^ Bity ^ Popis ^ | 0x004 | SPILED_REG_LED_LINE_o | 31 .. 0 | Řádka 32 žlutých LED diod mapovaná přímo do paměti | | 0x010 | SPILED_REG_LED_RGB1_o | 23 .. 0 | Zápis RGB hodnot do PWM registrů pro RGB LED 1 | | | | 23 .. 16 | Červená složka R | | | | 15 .. 8 | Zelená složka G | | | | 7 .. 0 | Modrá složka B | | 0x014 | SPILED_REG_LED_RGB2_o | 23 .. 0 | Zápis RGB hodnot do PWM registrů pro RGB LED 2 | | | | 23 .. 16 | Červená složka R | | | | 15 .. 8 | Zelená složka G | | | | 7 .. 0 | Modrá složka B | | 0x018 | SPILED_REG_LED_KBDWR_DIRECT_o | 31 .. 0 | Přímý zápis do LED a výstupu/scanu klávesnice | | | | 2 .. 0 | Přímý výstup (or) na R, G a B diody RGB LED 1 | | | | 5 .. 3 | Přímý výstup (or) na R, G a B diody RGB LED 2 | | | | 6 | Samostatná stavová LED dioda | | | | 7 | Samostatná stavová LED dioda | | | | 11 .. 8 | Výběr řady klávesnice | | 0x020 | SPILED_REG_KBDRD_KNOBS_DIRECT_o | 31 .. 0 | Zpětná odezva klávesnice a otočných voličů | | | | 3 .. 0 | Zpětná odezva klávesnice | | | | 16 | Nefiltrovaný stav kanálu A modrého voliče B | | | | 17 | Nefiltrovaný stav kanálu B modrého voliče B | | | | 18 | Nefiltrovaný stav tlačítka modrého voliče B | | | | 19 | Nefiltrovaný stav kanálu A zeleného voliče G | | | | 20 | Nefiltrovaný stav kanálu B zeleného voliče G | | | | 21 | Nefiltrovaný stav tlačítka zeleného voliče G | | | | 22 | Nefiltrovaný stav kanálu A červeného voliče R | | | | 23 | Nefiltrovaný stav kanálu B červeného voliče R | | | | 24 | Nefiltrovaný stav tlačítka červeného voliče R | | 0x024 | SPILED_REG_KNOBS_8BIT_o | 31 .. 0 | Filtrované hodnoty voličů jako 8 bit čísla | | | | 7 .. 0 | Relativní natočení modrého voliče B | | | | 15 .. 8 | Relativní natočení zeleného voliče G | | | | 23 .. 16 | Relativní natočení červeného voliče R | | | | 24 | Filtrovaná hodnota tlačítka modrého voliče B | | | | 25 | Filtrovaná hodnota tlačítka zeleného voliče G | | | | 26 | Filtrovaná hodnota tlačítka červeného voliče R | Další informace pro zájemce o vlastní návrh periferie pro integrovaný procesor v hradlovém poli Implementace periferie se nachází v adresáři [[https://gitlab.fel.cvut.cz/canbus/zynq/zynq-can-sja1000-top/tree/microzed_apo/system/ip/spi_leds_and_enc_1.0/hdl|/system/ip/spi_leds_and_enc_1.0/hdl]]. Protože se v případě LED diod a otočných voličů jedná o pomalé periferie a množství pinů využitelných pro zajímavější a rychlejší rozhraní jako jsou kamery je velké, tak jsou pro přenesení vstupně výstupních signálů z a do pomalých periferií využité sériově (SPI sběrnice) připojené GPIO expandery. Přenášená je v obou směrech posloupnost 48 bitů. O přenos se stará instance [[https://gitlab.fel.cvut.cz/canbus/zynq/zynq-can-sja1000-top/blob/microzed_apo/system/ip/spi_leds_and_enc_1.0/hdl/spi_leds_and_enc_v1_0.vhd#L263|spi_leds_and_enc_v1_0_spi_fsm_inst]] komponenty [[https://gitlab.fel.cvut.cz/canbus/zynq/zynq-can-sja1000-top/blob/microzed_apo/system/ip/spi_leds_and_enc_1.0/hdl/spi_leds_and_enc_v1_0_spi_fsm.vhd|spi_leds_and_enc_v1_0_spi_fsm]]. O realizaci sady registrů připojených k CPU sběrnicí AXI se pak stará komponenta [[https://gitlab.fel.cvut.cz/canbus/zynq/zynq-can-sja1000-top/blob/microzed_apo/system/ip/spi_leds_and_enc_1.0/hdl/spi_leds_and_enc_v1_0_S00_AXI.vhd#L550|spi_leds_and_enc_v1_0_S00_AXI]]. V odkazované části na konci zdrojového kódu je zřetelně vidět, jak jsou jednotlivé logické signály a jejich skupiny mapované do bitů a bitových polí v jednotlivých registrech AXI periferie. === Paralelní LCD display === K vývojovému kitu je připojený grafický displej s lokálním řadičem, který se stará o obnovování obrazu na TFT LCD display s rozměry 480 x 320 bodů. Řadič přijímá příkazy zapisované na 16-bitovou bránu mapovanou do fyzického paměťového prostoru na adresu 0x43c00008 (PARLCD_REG_BASE_PHYS+PARLCD_REG_CMD_o). Většina příkazů pak vyžaduje pro provedení vlastní operace zapsání dat. Data je potřeba zapsat na adresu 0x43c0000c (PARLCD_REG_BASE_PHYS+PARLCD_REG_DATA_o). Příklady práce s LCD naleznete na stráce [[..:..:tutorials:09:start#Grafický výstup na display desky MZ_APO|cvičení 09]]. Sada registrů začíná na fyzické adrese PARLCD_REG_BASE_PHYS ^ Ofset registru ^ Symbolické označení ^ Bity ^ Popis ^ | 0x000 | PARLCD_REG_CR_o | 31 .. 0 | Řídicí registr periferie | | | | 1 | Generování signálu reset pro display | | 0x008 | PARLCD_REG_CMD_o | 7 .. 0 | Generování řídicího cyklu/zápis příkazu do řadiče LCD | | 0x00C | PARLCD_REG_DATA_o | 15 .. 0 | Generování datového 16-bit cyklu/zápis příkazu do řadiče LCD | | 0x00C | PARLCD_REG_DATA_o | 31 .. 0 | Generování dvou datových cyklů pro řadič (15 .. 0) a (31 .. 16) | Implementace periferie se nachází v adresáři [[https://gitlab.fel.cvut.cz/canbus/zynq/zynq-can-sja1000-top/tree/microzed_apo/system/ip/display_16bit_cmd_data_bus_1.0/hdl|/system/ip/display_16bit_cmd_data_bus_1.0/hdl]]. === Výstupu na modelářská serva nebo pro PS2 klávesnici/myš === Sada registrů začíná na fyzické adrese SERVOPS2_REG_BASE_PHYS ^ Ofset registru ^ Symbolické označení ^ Bity ^ Popis ^ | 0x000 | SERVOPS2_REG_CR_o | 31 .. 0 | Řídicí registr periferie a přímé ovládání | | | | 0 | Nastavení klidové hodnoty (H/L) pro LED/SERVO1 | | | | 1 | Nastavení klidové hodnoty (H/L) pro LED/SERVO2 | | | | 2 | Nastavení klidové hodnoty (H/L) pro LED/SERVO3 | | | | | překrývá se s PS2 Clock | | | | 3 | Nastavení klidové hodnoty (H/L) pro LED/SERVO4 | | | | | překrývá se s PS2 Data, defaultně třetí stav | | | | 8 | řízení směru signálu SERVO4/PS DATA, 0 .. in, 1 .. out | | 0x00C | SERVOPS2_REG_PWMPER_o | 23 .. 0 | Perioda PWM cyklu v kroku 10 ns | | 0x010 | SERVOPS2_REG_PWM1_o | 23 .. 0 | Plnění PWM signálu SERVO1 v kroku 10 | | 0x014 | SERVOPS2_REG_PWM2_o | 23 .. 0 | Plnění PWM signálu SERVO2 v kroku 10 | | 0x018 | SERVOPS2_REG_PWM3_o | 23 .. 0 | Plnění PWM signálu SERVO3 v kroku 10 | | 0x01C | SERVOPS2_REG_PWM4_o | 23 .. 0 | Plnění PWM signálu SERVO4 v kroku 10 | Implementace periferie se nachází v adresáři [[https://gitlab.fel.cvut.cz/canbus/zynq/zynq-can-sja1000-top/tree/microzed_apo/system/ip/servo_led_ps2_1.0/hdl|/system/ip/servo_led_ps2_1.0/hdl]]. === PWM audio výstup === Sada registrů začíná na fyzické adrese AUDIOPWM_REG_BASE_PHYS ^ Ofset registru ^ Symbolické označení ^ Bity ^ Popis ^ | 0x000 | AUDIOPWM_REG_CR_o | 31 .. 0 | Řídicí registr periferie | | 0x008 | AUDIOPWM_REG_PWMPER_o | 23 .. 0 | Perioda PWM cyklu v kroku 10 ns | | 0x00C | AUDIOPWM_REG_PWM_o | 23 .. 0 | Plnění PWM signálu v kroku 10 | Implementace periferie se nachází v adresáři [[https://gitlab.fel.cvut.cz/canbus/zynq/zynq-can-sja1000-top/tree/microzed_apo/system/ip/audio_single_pwm_1.0/hdl|/system/ip/audio_single_pwm_1.0/hdl]]. === Periferie pro řízení stejnosměrného motorku === Tato periferie byla původně navržená pro předmět Programování systémů reálného času (B3M35PSR, B4B35PSR). Do FPGA návrhu pro předmět Architektura počítačů je zahrnutá volitelně. Návrh periferie je zahrnutý dvakrát. Jednou pro připojení výkonového stupně a odečtu polohy ke konektoru PMOD1, pro který jsou registry mapované od adresy DCSPDRV_REG_BASE_PHYS_0 a podruhé pro motor připojený přes konektor PMOD2, bázvá adresa DCSPDRV_REG_BASE_PHYS_1. ^ Ofset registru ^ Symbolické označení ^ Bity ^ Popis ^ | 0x0000 | DCSPDRV_REG_CR_o | 31 .. 0 | Řídicí registr periferie | | | | 4 | Přímé řízení výstupu PWMA | | | | 5 | Přímé řízení výstupu PWMB | | | | 6 | Povolit výstup PWM podle plnění a periody | | | | 8 | Vynulování načítané polohy v IRC | | 0x0004 | DCSPDRV_REG_SR_o | 31 .. 0 | Stavový registr periferie | | | | 8 | Logická úroveň na pinu IRCA | | | | 9 | Logická úroveň na pinu IRCB | | | | 10 | Logická úroveň na pinu IRC IRQ | | 0x0008 | DCSPDRV_REG_PERIOD_o | 31 .. 0 | Nastavení periody PWM po 10 ns (100 MHz) | | | | 29 .. 0 | Nastavení délky PWM (vhodných 5000, 20 kHz) | | 0x000C | DCSPDRV_REG_DUTY_o | 31 .. 0 | Regist pro nasvaneí požadované úrovně plnění PWM, jednotka 10 ns | | | | 29 .. 0 | Maska implementovaných bitů, nastavení délky pulsu/plnění v periodě | | | | 30 | Volba směru aplikace napětí na motor | | | | 31 | Volba napětí pro opačný směr otáčení | | 0x0010 | DCSPDRV_REG_IRC_o | 31 .. 0 | Napočítaný počet inkrementů/poloha/natočení motoru | Implementace periferie se nachází v adresáři [[https://gitlab.fel.cvut.cz/canbus/zynq/zynq-can-sja1000-top/-/tree/master/system/ip/dcsimpledrv_1.0/hdl|/system/ip/dcsimpledrv_1.0/hdl]]. ==== Další periferie ==== === Uživatelské tlačítko na procesorovém modulu === Tlačítko je přivedené na pin PS_MIO51_501 SoC Zynq. V jádru Linux je pro MIO nastaven offset 906. Pro přístup k uživatelskému tlačítku je tedy potřeba přistupovat k GPIO pinu 957 (= 906 + 51). echo 957 > /sys/class/gpio/export cat /sys/class/gpio/gpio957/value === Uživatelská LED na procesorovém modulu === LED je přivedená na pin PS_MIO47_501 SoC Zynq. V jádru Linux je pro MIO nastaven offset 906. Pro přístup k uživatelské LED je tedy potřeba přistupovat k GPIO pinu 953. echo 953 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio953/direction echo 1 > /sys/class/gpio/gpio953/value ==== Odkazy ==== * [[https://youtu.be/W6DrS8H5YJg|Workshop - Real Embedded Linux, FPGA and Motion Control Systems]], workshop [[https://installfest.cz/if21/|Installfest 2021]], [[https://pretalx.installfest.cz/media/installfest-2021/submissions/GBKNKE/resources/mz_apo-remote-lab_K5ZFgyq.pdf|Prezentace ve formátu PDF]]. * [[https://www.youtube.com/watch?v=sNtlEysC0yA|GNU/Linux and FPGA in Real-time Control Applications]], přednáška [[https://installfest.cz/if17/|Installfest 2017]]. [[https://installfest.cz/if17/slides/so_t2_pisa_realtime.pdf|Prezentace ve formátu PDF]]. * Použití desek MZ_APO pro distribuované řízení motorů s využitím průmyslové sběrnice [[https://en.wikipedia.org/wiki/CAN_bus|CAN]]. [[https://www.youtube.com/watch?v=hYC-XznyOlQ|Video]] z konference [[https://www.linuxdays.cz/2017/index.html|Linux Days 2017]]. [[https://www.linuxdays.cz/2017/video/Pavel_Pisa-CAN_canopen.pdf|Prezentace ve formátu PDF]] * [[https://rtime.felk.cvut.cz/hw/index.php/Zynq|Poznámky k programování SoC Zynq]]. * [[https://github.com/ppisa/zynq-rt-utils-and-builds|GIT repositář]] s konfigurací jádra [[https://www.kernel.org/|Linux]] a zavaděče [[http://www.denx.de/wiki/U-Boot/WebHome|U-boot]] s úpravami pro kyty MZ_APO * Martin Jeřábek - diplomová práce [[https://dspace.cvut.cz/bitstream/handle/10467/80366/F3-DP-2019-Jerabek-Martin-Jerabek-thesis-2019-canfd.pdf|Open-source and Open-hardware CAN FD Protocol Support]]