Už Lenin říkal: Učit se, učit se, učit se!
Ano, je to trošku provokace začít článek citací z Lenina, ale myslím, že na Lupě to pobouří míň, než kdybych citoval, třeba Billa Gatese. Že? Ale žerty stranou: většina lidí se v životě dostane do bodu, kdy si uvědomí, že učení nikdy nekončí a že se budou učit stále a stále. Nejčastěji k tomuto poznání lidé dospějí několik let po škole, kdy jim dojde, že ani červený diplom nezajistí respekt, a že v práci začínají téměř od nuly.
V technologiích to platí dvojnásob. V souvislosti s Internetem věcí se mne lidé ptají: “A co bych se měl naučit, když mě to zajímá?” Většinou se ptají lidé, co umí třeba programovat. Odpovídám vždy totéž: Měli byste se naučit nějaké základy elektroniky, tj. vědět, co je proud, napětí, jak funguje obvod, jak fungují základní součástky, klidně vynechejte návrhy filtrů či operační zesilovače a spíš se pak soustřeďte na logické obvody, hradla, klopné obvody, čítače, procesory, jednočipy a třeba sběrnice (SPI, I2C apod.) To jsou věci, které budete potřebovat nezbytně. S nimi si ale dokážete navrhnout vlastní jednoduché zapojení. Samozřejmě, může se stát, že vám nebude fungovat, třeba proto, že si nespočítáte, že jeden pin jednočipu nedá dostatek proudu k tomu, aby rozsvítil žárovku, nebo tak něco. Ale jednoduché zapojení budete schopni postavit.
U programování se nemusíte učit nic speciálního. Pokud použijete Raspberry Pi, vystačíte si i s Pythonem, pokud použijete Arduino nebo jiný jednočip, pak C. C++, natož C# či Java vám moc užitečné nebudou; nezapomínejte, že se pohybujeme o několik úrovní níž. Viděl jsem kód pro Arduino, napsaný skvělým programátorem v C#. Byl funkční, ale hrozně velký a neefektivní (používal malloc a podobné funkce tam, kde zkušený Céčkař nadeklaruje pole pevné velikosti apod.) Takže když sestupujete k C, měli byste zapomenout na některé skvělé zásady, co vám vtloukali do hlavy, a zkusit myslet jako překladač. Samozřejmě hodně pomůže, když si dovedete představit, jak bude kód ve výsledku vypadat v assembleru, takže pokud se chcete zdokonalit v C, podívejte se na to, jak vlastně pracuje procesor. Klidně i osmibitový. Případné zájemce o interaktivní kurz assembleru 8080 a 6502 mohu odkázat na svůj vlastní web strojak.cz (zatím pouze pro tyto dva procesory, až najdu chvíli volného času, přidám další; v plánu mám Z80, 1802, 6809 a 65816, nikoli nutně v tomto pořadí).
Intermezzo: Když už jsme u elektroniky, tak si povězme opět něco z historie počítačů. Před vznikem mikroprocesorů se řídicí jednotky počítačů sestavovaly z integrovaných obvodů malé a střední integrace (SSI a MSI). Vše, co později obsahovalo pouzdro mikroprocesoru, se sestavovalo z čítačů, klopných obvodů, multiplexerů a podobných obvodů. Takový procesor tvořilo třeba i několik desek plošných spojů. Jednou ze základních částí byla i aritmeticko-logická jednotka (ALU). Ze začátku se rovněž i ona sestavovala z jednodušších komponent, později přišly na trh monolitické ALU – například řada 74×x obsahovala obvod 74181. Vyvinul ji známý výrobce Texas Instruments a na trh uvedl v roce 1970 (do uvedení prvního mikroprocesoru zbývalo už jen pár let). 74181 je čtyřbitová aritmeticko-logická jednotka, která měla vstupy pro dva operandy (2 × 4 bity), 4bitový výstup, vstupy a výstupy přenosu (carry) a vstupy, kterými se vybírala požadovaná operace. Jednotka nabízela mód aritmetický a logický, uměla pracovat s invertovanými signály a v každém z těchto režimů nabízela 16 operací (viz datasheet).
Nejlíp se člověk, jak známo, učí tím, že se o něco pokusí sám. Autor tohoto projektu stvořil obvod 74181 uvnitř programovatelného logického pole (CPLD).
Což mě přivádí k dalšímu tématu, tentokrát pro lehce pokročilé. Pokud hledáte, co byste se naučili ze světa elektroniky, podívejte se právě do této oblasti. Programovatelná logická pole jsou, promiňte mi ten výraz, naprosto děsivé obvody – samy o sobě neumí téměř nic, ale vy si v nich můžete vytvořit celé kompletní zapojení složitého obvodu. Do těch nejmenších se vám vejde například “glue logic” pro nějaké vlastní zapojení, do těch největších celé složité zařízení, například mnohaportový router s vlastním RISCovým řídicím procesorem. Já používám a doporučuju programovatelná pole, která jsou na spodní hranici těch výkonnějších. Jejich výhodou je, že se dají snadno sehnat levné vývojové desky s těmito obvody (do tisíce Kč – viz tipy na fpga.cz), a přitom je jejich výkon dostatečný pro ledajaké kejkle.
Představte si například osmibitový počítač s procesorem 6502 (nebo Z80, nebo dokonce 6809), 4 kB RAM, 8 kB ROM, výstup na standardní VGA displej, vstup standardní PS/2 klávesnice, sériové rozhraní pro komunikaci… Ano, tohle všechno se vejde do nejmenšího obvodu z řady Cyclone II. Ostatně, podívejte se sami – jmenuje se to Multicomp a autor Grant Searle to pojal jako stavebnici, kde si vyberete, jaké moduly má váš počítač obsahovat, a pak už to jen “přeložíte” a naprogramujete do FPGA.
Trošku problém je se slovem “programovat” a “programovatelný”. Ony se totiž tyto obvody neprogramují tak, jak jsou programátoři zvyklí, tedy “teď se stane to, pak tamto, pak ono, a když něco, tak něco”. Ve skutečnosti je zápis obvodů, například ve VHDL, podobnější, řekněme, zápisu webové stránky v HTML/CSS, kde spíš popisujeme, co je obsahem, jakou má strukturu a jak má vypadat, než že by se něco dělo po něčem. V jazycích pro programovatelná pole se určuje, jaké jsou komponenty, jak fungují a jak jsou propojeny. Pro programátora je to zcela jiný svět, kde se všechno, co napíše, děje “najednou” a “neustále”, což může představovat hodně velký mentální skok.
Jazyků pro popis obvodů je víc, nejznámější jsou VHDL a Verilog. Verilog má pak nad sebou ještě nějaké nadstavby, které usnadňují popis komplexnějších obvodů. Existují i jazyky jako je například SystemC, které k problematice přistupují z odlišného úhlu, ale základní dva jazyky, s nimiž se setkáte u menších projektů, jsou právě VHDL a Verilog. Z hlediska schopností a použití mezi nimi není až takový rozdíl, dokonce můžete v jednom z nich používat moduly, napsané v tom druhém, a systém si s tím poradí. Liší se v syntaktických pravidlech, a do jisté míry by se daly přirovnat k Pascalu (VHDL) a k C (Verilog). Pokud se nerozhodnete ani podle těchto preferencí, tak vězte, že v Evropě je populárnější VHDL, v USA je to Verilog, a že VHDL má o trošku lepší schopnosti při popisu větších zapojení.
Pokud se tedy chcete naučit něco opravdu zajímavého, poohlédněte se po jednom z těchto jazyků. Na webu vhdl.cz jsem sepsal takový základní úvod do VHDL, ale naleznete i jiné materiály. Doporučil bych, z vlastní zkušenosti, sáhnout spíš po anglicky psané literatuře.