CPU – FPGA rozhraní pro náročné aplikace

Jedním z projektů vlastního vývoje ve společnosti Ryston Electronics je univerzální procesorový modul Combi, který byl stručně popsán v [1]. Na jedné malé desce vícevrstvého plošného spoje je kompletní mikropočítač s jádrem ARM9 na 200/400 MHz, paměťmi a podpůrnými obvody, propojený 32-bitovou sběrnicí s obvodem FPGA. Na vnější konektor modulu je vyvedena ne datová sběrnice, ale periferní signály a sériová rozhraní (UARTy, SPI, I2C) s příslušnými selekty, analogové vstupy a další užitečné signály, zatímco na opačnou stranu desky jsou vyvedeny periferní signály z programovatelného logického obvodu.

 

To přináší překvapivé možnosti konstrukce velmi rychlých logických struktur v FPGA, které je možno doplňovat o softwarovou podporu z procesoru.

Blokové schéma modulu Combi je na Obr. 1

super BLOK schema 2

Obr. 1: Blokové schéma modulu

Obvod FPGA je po zapnutí nebo resetu nainicializován z procesoru, protože jeho vnitřní obvody jsou volatilní (závislé na napájení). Vznikla otázka, jak nejlépe propojit procesor a FPGA, aby jejich komunikace v prostředí víceúlohového operačního systému probíhala optimálně.

Proto ze strany procesoru byl obvod FPGA umístěn do jeho 32-bitového paměťového prostoru a k přístupu do něj slouží dva z procesorem generovaných selektových signálů. Obvod FPGA se chová vůči procesoru jako oblast rychlé dvouportové paměti RAM, takže běžící programy mohou velmi rychle nezávisle komunikovat s blokem, který je jim přidělen. Velikost, struktura a významy jednotlivých bitů jsou určeny programem FPGA.

CPUI

Modul CPUI je částí programu ve FPGA a tvoří datové rozhraní mezi nadřízeným procesorem a uživatelskou aplikací v FPGA. Skládá se z určitého počtu „bran“ – bloků paměti, který je dán parametrem NumOfPorts. Počet bran je limitován pouze velikostí FPGA a volným adresovým prostorem. Každá z bran zaujímá adresový prostor 2048 bytů. Offset bran je definován parametrem Offsets(n). Offsets je pole typu integer, počet prvků je roven NumOfPorts. Prvky pole jsou násobkem 2048 a navzájem různé. Brána má 32-bitový výstup dat, 32-bitový vstup dat, 9-bitovou adresovou sběrnici, 4-bitový signál BS pro práci s jednotlivými byty a signál zápisu WR a souhrnnou žádost o přerušení pro procesor. Viz. obr. 2.

CPUI
                                                Obr. 2: Rozhraní CPUI  

Modul MEM/REGS

Pokud aplikace v FPGA využívá pro komunikaci s nadřízeným procesorem dvouportové paměti, je možno použít modul mem/regs. Tento modul zaujímá adresový prostor 2048 bytů. V tomto adresovém prostoru může být pole 32 – bitových registrů a vlastní paměť. Počet registrů je určen parametrem NumOfRegs. Registry jsou mapovány od konce adresového prostoru a zmenšují velikost využitelné dvouportové paměti. Počet registrů je limitován velikostí adresového prostoru, tj. max. 512 registrů na jednu bránu, a také velikostí FPGA. V praxi není velké množství registrů potřeba.

Komunikace přes dvouportovou paměť výrazně šetří zdroje FPGA. Modul obsahuje dvě brány, jednu směrem k CPUI a druhou směrem k uživatelské aplikaci, viz Obr. 2. Velikost portu REGS je závislá na počtu registrů daných parametrem NumOfRegs, tj. obsahuje NumOfRegs x 32 bitů. Komunikace s dvouportovou pamětí je v obou směrech 32 - bitová. Modul umožňuje oddělení taktové domény procesoru ( taktový signál mem_clk) a aplikace, resp. její části( taktový signál user_clk).

Projektové soubory

Pro použití ve vyšší sestavě jsou nutné tři soubory. Soubor CPUI.VHD implementuje modul CPUI, soubor MEM_BLOK_32_32.VHD implementuje modul mem/regs a v souboru CPU_INT_LIB.VHD jsou definovány potřené datové typy a konstanty. V souboru APP_TOP.VHD je uveden příklad použití modulů CPUI a MEM/REGS. Projekt je uložen ve složce CPU_INTERFACE.

Na tyto bloky pak zpravidla navazuje samotná logická struktura, realizovaná mocnými prostředky použitého obvodu FPGA (desetitisíce hradel a klopných obvodů). V naší aplikaci je to člen rodiny Spartan. Obvodem je možno realizovat velmi složité stavové automaty, řadiče, komunikační obvody, specializované procesory nebo vstupní či výstupní obvody, které navazují procesor na okolní prostředí. Může to například být řada PWM výstupních portů (převodníků číslo – střída) pro výkonové řízení spínanými regulátory.

Praktické použití

Uvedené moduly byly prakticky vyzkoušeny již v několika aplikacích. Jednou z nich je zpracování telekomunikačního rozhraní E1, kde ve 30 B kanálech probíhá duplexní komunikace podle V.110. Zjednodušeně je činnost tato: Jestliže přijde platný blok dat, je uložen v příslušném bloku dvouportové paměti a FPGA vygeneruje do fronty zprávu procesoru o této události a aktivuje žádost o přerušení. Procesor v obslužné rutině přečte zprávu, tím se shodí žádost, vyčte data a uloží je do struktury v paměti pro zpracování vyššími vrstvami protokolového zásobníku. Tato rutina je velice rychlá, protože je to jen jednoduchý přenos bloku paměti, plus ošetření přerušení., a proto nehrozí přetečení zásobníku.

Vyšší vrstvy protokolu už pracují ve víceúlohovém režimu podle toho, jak jim systém přiděluje prostředky.
V opačném směru komunikace je činnost podobná: když proces získá data pro odeslání, uloží je do příslušných míst sdílené paměti a nastaví v registru bit „vyšli“. Po odeslání je vygenerována zpráva a žádost o přerušení do procesoru, který doplní data do příslušné dvouportové paměti, aby se mohlo vysílat bez přestávek.

Další aplikací je například řízení polohy systému poháněného servomotorem. Poloha je odměřována dvojicí postupně zatmívaných (kvadraturních) signálů, z nichž jsou dekódovány impulsy pro 32-bitový obousměrný čítač polohy. Procesor tento čítač může kdykoli přečíst přes dvouportovou paměť. Další optický vstup funguje jako koncové čidlo, které definuje nulový stav.

Periodicky spouštěný řídicí program si může časovou diferenciací zjistit údaj o rychlosti a například pomocí adaptivního modelu vypočte pro žádaný pohyb hodnotu řídicí veličiny, což je výstup D/A převodníku do výkonového zesilovače, jímž je motor napájen. Vyšší vrstvy programového vybavení komunikují s nadřízeným systémem a rozkládají trajektorii složeného pohybu, zatímco další proces porovnává realitu s chováním modelu a průběžně ho adaptuje. Předpokládá se přitom, že řízený systém je objektem s mnoha nelinearitami a vazbami (např. různá setrvačnost při různých polohách ramene).

Prakticky bylo ověřeno, že použití jediného přerušovacího signálu s navazujícím mechanismen bran ve dvouportové paměti je časově úsporné a spolehlivé (neztrácejí se žádosti o obsluhu, ani „nevisí“ rozpracovaná obsluha události, a to ani ve velmi složitých situacích. Tento mechanismus je také velmi vhodný pro prostředí víceúlohového operačního systému s mnoha paralelními procesy, kterým Linux je.

 Závěr

Popsané rozhraní mezi procesorem a FPGA je výsledkem snahy usnadnit praktické aplikace Linuxovského procesoru, se vším nabízeným komfortem, pro práci v reálném čase. Za tímto účelem bylo optimalizováno jádro tohoto operačního systému pro kompromisní soft-RT řízení a byly vyvinuty hardwarové prostředky pro připojení modulu k ovládacím a snímacím obvodům pro běžné průmyslové řízení, jako přijímače a vysílače proudové smyčky 4-20 mA, opticky oddělené nebo reléové vstupy/výstupy apod.

Toto jádro opakovaně používáme v různých zakázkových systémech a snažíme se „vedlejší efekty“ tohoto procesu zúročit v neustále vylepšovaných projektech. Naštěstí jsme se, zdá se, „trefili“ do dlouhodobě podporovaného typu procesoru i logického obvodu, takže jsou pro ně dostupné aktualizace jak operačního systému, tak knihovních prvků i projektů třetích stran.