Komponenta PicoCPU je vytvořena jako univerzální procesor s pamětí a skládá se ze dvou části. První část tvoří procesorové jádro PicoBlaze od firmy Xilinx Inc. a druhou bloková paměť BRAM, která slouží jako paměť instrukcí. Jádro procesoru PicoBlaze tvoří velmi jednoduchý 8-bitový procesor vytvořený firmou Xilinx určený k použití v celé škále hradlových polí FPGA. Toto procesorové jádro disponuje instrukční sadou čítající 57 instrukcí. Maximální využitelná délka zásobníku pro uchování návratových adres (CALL/RETURN) je 31 položek.
Délka instrukcí procesoru PicoBlaze je, z důvodu efektivního využití paměti BRAM, 18 bitů. Dále je procesor vybaven 16-ti osmibitovými registry pro obecné použití a až 256 vstupními a 256 výstupními porty. Adresní sběrnice pro výběr instrukce má šířku 10 bitů a lze tedy vytvořit program dlouhý až 1024 instrukcí. Assembler, ve kterém lze napsat kód pro procesor PicoBlaze, se překládá pomocí programu KCPSM3, který je součástí balíku popsaného dále. Vlastní jádro procesoru PicoBlaze je navrženo jako jednoduchá komponenta, ke které stačí připojit pouze paměť obsahující instrukce programu. Bloková paměť BRAM je součástí komponenty PicoCPU, čímž se stává její použití velmi jednoduchým.
Z důvodu licenční politiky firmy Xilinx není možné, aby použité VHDL jádro procesoru a překladač KCPSM3 byly součástí SVN. Je proto nutné si nejprve z webových stránek Xilinx stáhnout balík PicoBlaze pro Spartan-3. Ten je možné nalézt na stránkách XILINX.
Balík, který lze zdarma stáhnout, obsahuje řadu souborů, které nejsou pro správnou funkci komponenty PicoCPU zapotřebí. Jádro procesoru PicoBlaze je obsaženo v souboru kcpsm3.vhd. Tento soubor je nutné nahrát do adresáře SVN fpga\units\picocpu\picoblaze\
. Komponenta PicoCPU přímo na tento soubor odkazuje a není tedy zapotřebí nic měnit.
Další důležitou součástí je překladač assembleru PicoBlaze. Ten je možné nalézt v adresáři Assembler a pro jeho chod jsou důležité následující soubory:
KCPSM3.EXE
ROM_form.coe
ROM_form.v
ROM_form.vhd
Program KCPSM3 funguje jako command-line překladač, jehož jediným parametrem je název souboru, obsahující zdrojový kód v assembleru. Překladač vytvoří několik souborů. Pro další zpracování se jako nejvhodnější jeví soubor s příponou .HEX, neboť jej lze poměrně jednoduše zpracovat v MCU a přes SPI uložit do blokové paměti PicoCPU. Další možností je využít vygenerovaného bloku ve VHDL (.VHD) či Verilogu (.V) a vysyntetizovat paměti BRAM se statickými daty.
Skokové instrukce: JUMP
, CALL
, RETURN
Aritmetické operace: ADD
, ADDCY
, SUB
, SUBCY
, COMPARE
Logické operace: LOAD
, AND
, OR
, XOR
, TEST
Operace posuvu a rotací: SR0
, SR1
, SRX
, SRA
, RR
, SL0
, SL1
, SLX
, SLA
, RL
Operace přerušení: RETURNI` ENABLE
, RETURNI DISABLE
, ENABLE INTERRUPT
, DISABLE INTERRUPT
Operace s hodnotami: STORE
, FETCH
Operace s porty: INPUT
, OUTPUT
Všechny instrukce trvají dva hodinové takty. Detailnější informace je možno nalézt v balíku PicoBlaze v manuálu KCPSM3 (KCPSM3_Manual.pdf).
Navržená komponenta obaluje základní jádro procesoru PicoBlaze a přidává instrukční paměť BRAM. Obsah paměti, tedy instrukce, je možno měnit online, jedinou podmínkou je, že procesor PicoBlaze musí být zastaven. Spuštění a zastavení vykonávání programu procesorem zajišťuje signál CORE_EN. Pokud je tento signál ve stavu log. 0, je možno modifikovat obsah paměti. Pokud je ve stavu log. 1, paměť lze pouze číst a jádro procesoru uvedený program vykonává. Přístup k paměti je realizován signály RAM_ADDR, RAM_DATA_IN, RAM_DATA_OUT a RAM_DATA_WE. Pro přístup k paměti v režimu čtení stačí modifikovat adresu, danou signálem RAM_ADDR a hodnota (tedy instrukce) je přímo vystavena na sběrnici RAM_DATA_OUT. Zápis do paměti je realizován vystavením kódu instrukce na sběrnici RAM_DATA_IN a nastavením signálu RAM_DATA_WE do log. 1. Taktování procesoru i paměti probíhá signálem CLK a lze tedy rychlost vykonávání programu měnit dle požadavků.
Další součástí procesoru jsou porty. Procesorové jádro PicoBlaze může vybrat vždy 1 z 256 zařízení připojených k portu signálem PORT_ID, se kterým se v tu chvíli pracuje. Pokud program zapíše data na port pomocí instrukce OUTPUT, jsou data vystavena na sběrnici OUT_PORT a signál WRITE_STROBE, označující platnost výstupních data procesoru, je nastaven na log. 1. Pokud procesor vyžaduje čtení z portu, je využit signál READ_STROBE, který označuje požadavek vystavení dat na sběrnici IN_PORT.
Poslední součástí, se kterou umí komponenta PicoCPU pracovat, je řadič přerušení. Vstupní přerušení pro procesor je realizováno nastavením signálu INTERRUPT na log. 1. Pokud je toto přerušení akceptováno a provedeno, je nastaven signál INTERRUPT_ACK na log. 1.
Rozhraní implementované PicoCPU komponenty je vyobrazeno na obrázku 2.1.
Popis vstupních a výstupních signálů entity komponenty:
CLK - vstupní hodinový signál komponenty
RST - reset komponenty
CORE_EN - aktivace procesorového jádra
PORT_ID - identifikátor vybraného portu
IN_PORT - vstupní 8-bit port procesoru
READ_STROBE - příznak čtení dat z vybraného portu
OUT_PORT - výstupní 8-bit port procesoru
WRITE_STROBE - příznak platnosti dat na výstupním portu
INTERRUPT - signál přerušení procesoru
INTERRUPT_ACK - potvrzení přerušení
RAM_ADDR - výběr adresy v programové paměti instrukcí
RAM_DATA_IN - vstupní hodnota instrukce pro zápis na vybranou adresu
RAM_DATA_WE - potvrzení zápisu instrukce na vybranou adresu
RAM_DATA_OUT - hodnota instrukce na vybrané adrese