ZPU Evo(lution)

English


La ZPU e’ un microprocessore a 32 bit basato su stack, originariamente progettato da Øyvind Harboe di Zylin AS. La documentazione originale e’ disponibile sul sito web Zylin/OpenCore o Wikipedia. Si tratta di un microprocessore destinato ad applicazioni embedded su FPGA con un utilizzo minimo di elementi logici e BRAM, a scapito della velocita’ di esecuzione.

Zylin ha prodotto due design in open source, ovvero le versioni Small e Medium della ZPU. Design aggiuntivi sono stati prodotti da sviluppatori esterni come le varianti Flex e ZPUino, ciascuna offrendo miglioramenti al design originale come interfaccia Wishbone, prestazioni migliorate, ecc.

Questo documento descrive un altro design che definisco modello ZPU Evo(lution), il cui focus e’ su prestazioni, connettivita’ e espansione del set di istruzioni. Questo e’ nato dalla necessita’ di una CPU per un emulatore di un computer vintage che sto sviluppando, che fungerebbe da processore IO per fornire servizi di Menu, Periferiche e SD.

Un esempio delle prestazioni della ZPU Evo si puo’ osservare utilizzando CoreMark, che restituisce un valore di 22,2 a 100MHz su fabric Altera utilizzando BRAM, e per Dhrystone 13,2 DMIPS. I confronti possono essere fatti con i design ZPU originali nella galleria sottostante, prestando attenzione al punteggio CoreMark che sembra essere lo standard de facto attuale. La connettivita’ si manifesta attraverso l’implementazione sia del bus di sistema che del bus Wishbone, consentendo la connessione di molti dispositivi IP open source. L’espansione del set di istruzioni si manifesta attraverso l’inclusione di una cache L1 strettamente accoppiata dove piu’ byte di istruzioni vengono prelevati e resi disponibili alla CPU, che a sua volta puo’ essere utilizzata per l’ottimizzazione (es. fino a 5 istruzioni IM eseguite in 1 ciclo) o per istruzioni multi-byte estese (es. implementazione di un’istruzione LoaD Increment Repeat). C’e’ spazio per molti altri miglioramenti come cache dello stack, modalita’ burst da SDRAM a L2, esecuzione parallela di istruzioni (es. and + neqbranch), che sono nella mia lista.

La CPU

La ZPU Evo segue la ZPU Medium e Flex, e parti del codice sono simili, ad esempio la decodifica delle istruzioni. Il design differisce tuttavia per il caching e l’implementazione di un Memory Transaction Processor attraverso il quale vengono instradate tutte le operazioni di Memoria/IO (ad eccezione delle letture dirette di istruzioni se il bus di istruzioni dual-port e’ abilitato). Le CPU originali gestivano tutte le loro esigenze di memoria in loco o come parte della macchina a stati, mentre la Evo invia una richiesta al MXP ogni volta che e’ necessaria un’operazione di memoria.

Le sezioni seguenti descrivono alcune delle caratteristiche e modifiche rispetto ai design ZPU originali.

Struttura del bus

La ZPU ha uno spazio di indirizzamento lineare con tutti i dispositivi di memoria e IO direttamente indirizzabili all’interno di questo spazio. I design ZPU esistenti forniscono un bus di sistema o un bus Wishbone, mentre la Evo fornisce entrambi. La ZPU Evo crea fino a due regioni distinte nello spazio di indirizzamento a seconda della configurazione, per fornire un bus di sistema e un bus Wishbone.

Tutti i modelli hanno il bus di sistema istanziato, che inizia all’indirizzo CPU 0 e si estende fino al limite imposto dal bit di indirizzo massimo configurabile (es. 0x000000 - 0xFFFFFF per 24 bit). Una regione IO dedicata memory-mapped e’ riservata nella parte superiore dello spazio di indirizzamento (es. 0xFF0000 - 0xFFFFFF).

Se configurato, un bus Wishbone puo’ essere istanziato, estendendo il bit di indirizzo massimo di 1 (es. 0x1000000 - 0x1FFFFFF per l’esempio a 24 bit). Questo crea effettivamente 2 regioni identiche, quella inferiore controllata tramite il bus di sistema, quella superiore tramite il bus Wishbone. Come per il bus di sistema, l’area superiore dello spazio di indirizzamento Wishbone e’ riservata per i dispositivi IO.

Un terzo bus puo’ essere configurato, destinato solo alle letture di istruzioni. Questo bus tipicamente rispecchia il bus di sistema nella regione di memoria ma e’ considerato connesso a memoria ad accesso rapido per la lettura di istruzioni senza necessita’ di Cache L2. Questo sarebbe tipicamente la seconda porta di un blocco BRAM dual-port con la prima porta connessa al bus di sistema.

Cache L1

Per ottenere prestazioni ma soprattutto per le ottimizzazioni delle istruzioni e le istruzioni estese, una cache L1 e’ implementata utilizzando registri. L’uso di registri consuma spazio fabric e quindi deve essere molto piccola, ma permette l’accesso casuale in un singolo ciclo, necessario ad esempio per compattare un caricamento IM a 32 bit (che puo’ essere di 5 istruzioni) in un singolo ciclo. Anche per le istruzioni estese, il primo byte indica un’istruzione estesa e i successivi 1-5 byte definiscono l’istruzione che viene poi eseguita in un singolo ciclo.

Cache L2

La BRAM interna (Block RAM on-board all’interno dell’FPGA) non necessita di una Cache L2 poiche’ il suo tempo di accesso e’ di 1-2 cicli. Poiche’ la BRAM e’ una risorsa limitata, si presume che verra’ utilizzata RAM esterna o SDRAM, che e’ molto piu’ lenta e necessita di essere memorizzata in cache per aumentare il throughput. La Cache L2 viene utilizzata a questo scopo, per leggere in anticipo un blocco di RAM esterna e alimentare la Cache L1 secondo necessita’. Dall’analisi, i programmi C generati da GCC sono tipicamente cicli e chiamate all’interno di un’area locale (a meno che non si utilizzino librerie di grandi dimensioni), quindi l’implementazione di una semplice cache a mappatura diretta tra RAM esterna e BRAM (utilizzata per la Cache L2) indicizzata relativamente al Program Counter e’ sufficiente per evitare lo stallo della CPU nella maggior parte dei casi.

Set di istruzioni

Una caratteristica della ZPU e’ l’uso di un set fisso minimo di istruzioni implementate in hardware e un set soft di istruzioni aggiuntive implementate in pseudo-microcodice (cioe’ il set fisso di istruzioni). Questo viene ottenuto tramite vettori di 32 byte nella regione 0x0000 - 0x0400 e ogni istruzione soft si dirama al vettore se non e’ implementata in hardware. Il vantaggio e’ la riduzione delle risorse FPGA, ma la penalita’ e’ la prestazione.

La ZPU Evo implementa tutte le istruzioni in hardware, ma questo puo’ essere regolato nella configurazione per utilizzare istruzioni soft se necessario per conservare le risorse FPGA. Questo consente un equilibrio tra risorse e prestazioni. In definitiva pero’, se le risorse sono limitate, l’uso dei modelli Small/Flex della ZPU potrebbe essere una scelta migliore.

Oltre alle istruzioni originali, esiste un meccanismo per estendere il set di istruzioni utilizzando istruzioni multi-byte nel formato:

Extend Instruction,<new insn[7:2]+ParamSize[1:0]>,[byte],[byte],[byte],[byte]

Dove ParamSize =

  • 00 - Nessun byte parametro,
  • 01 - Parametro a 8 bit,
  • 10 - Parametro a 16 bit,
  • 11 - Parametro a 32 bit

Alcune istruzioni estese sono in fase di sviluppo (es. LDIR); un valore di opcode esatto e un set di istruzioni esteso non sono ancora stati completamente definiti. L’assembler GNU AS verra’ aggiornato con queste istruzioni in modo che possano essere invocate all’interno di un programma C e, eventualmente, se sono utili per il C, verranno migrate nel compilatore GCC (es. ADD32/DIV32/MULT32/LDIR/LDDR).

Set di istruzioni implementato

La tabella completa del set di istruzioni e’ identica alla versione inglese ed e’ documentata li’.

Tabella di confronto delle istruzioni implementate

alt text

Hardware Variable Byte Write

Nei design ZPU originali, c’era margine ma nessuna implementazione per consentire alla ZPU di eseguire scritture byte/half-word/full-word. La CPU doveva eseguire operazioni sempre allineate a parola a 32 bit o eseguire l’operazione in microcodice.

Nella Evo, e’ stato implementato hardware (selezionabile al momento del build) per consentire scritture byte e half-word nonche’ operazioni hardware Read-Update-Write. Se la logica hardware byte/half-word non e’ attivata, viene utilizzata la logica Read-Update-Write a parola a 32 bit. Entrambi i metodi hanno vantaggi prestazionali, con quest’ultimo che richiede 3 cicli in piu’.

Hardware Debug Serializer

Per eseguire il debug della CPU o semplicemente fornire informazioni operative interne a basso livello, e’ implementato un modulo di debug UART con buffer. Attualmente e’ destinato solo all’output, ma verra’ collegato all’IOCP per il debug in-situ quando la simulazione/Signal-Tap non e’ disponibile.

Incorporati nel RTL della CPU ci sono istruzioni selezionabili attivate per livello che inviano informazioni snapshot al serializzatore. Le istruzioni vengono espanse, serializzate e inviate a un terminale connesso.

 
000477 01ffec 00001ae4 00000000 70.17 04770484 046c047c 08f0046c 0b848015 17700500 05000500 05001188 11ef2004

Break Point - Illegal instruction
PC          Stack    TOS          NOS           Insn     Signals      Signals       Signals       Signals      L1 Insn Q    L1 Insn Q    L1 Insn Q    L1 Insn Q

Tutte le informazioni critiche come l’istruzione correntemente in esecuzione (o meno, se in stallo), segnali/flag, contenuti della cache L1/L2 e contenuti della memoria possono essere emesse in output.

Vincoli di temporizzazione

Questo e’ un lavoro in corso. Il design viene progressivamente aggiornato e/o vengono aggiunti vincoli affinche’ la temporizzazione sia pienamente rispettata. Attualmente a 100MHz c’e’ slack negativo, anche se il design e’ completamente funzionante. Questo verra’ corretto in futuro in modo che la temporizzazione analizzata da TimeQuest sia rispettata.

System On a Chip

Per fornire un framework funzionante in cui la ZPU Evo possa essere utilizzata, e’ stato creato un wrapper System On a Chip che consente l’istanziazione di vari dispositivi (es. UART/scheda SD).

Come parte dello sviluppo, i modelli ZPU Small/Medium/Flex sono stati integrati nel framework, consentendo la scelta della CPU quando lo spazio fabric e’ limitato o quando si confrontano le CPU, anche se funzionalita’ come Wishbone non sono disponibili nei modelli ZPU originali.

Il SoC attualmente implementa (nell’albero di build):

Component Option Comment
CPU Yes ZPU Small, Medium, Flex, Evo or Evo Minimal.
Wishbone Bus Yes 32 bit Wishbone bus.
(SB) BRAM Yes Implement a configurable block of BRAM as the boot loader and stack.
Instruction Bus BRAM Yes Enable a separate bus (or Dual-Port) to the boot code implemented in BRAM.
(SB) RAM Yes Implement a block of BRAM as RAM, separate from the BRAM used for the boot loader/stack.
(SB) SDRAM Yes Implement an SDRAM controller on the system bus.
(WB) SDRAM Yes Implement an SDRAM controller over the Wishbone bus.
(WB) RAM Yes Implement a block of BRAM as RAM over the Wishbone bus.
(WB) I2C Yes Implements an I2C Controller over the Wishbone bus.
(SB) Timer 0 No Implements a hardware 12bit Second, 18bit milliSec and 24bit uSec down counter with interrupt, a 32bit milliSec up counter with interrupt and a YMD HMS Real Time Clock.
(SB) Timer 1 Yes A selectable number of pre-scaled 32bit down counters.
(SB) UART 0 No A cached UART used for monitor output and command input/program load.
(SB) UART 1 No A cached UART used for software (C program)/hardware (ZPU debug serializer) output.
(SB) Interrupt Controller Yes A prioritized configurable (# of inputs) interrupt controller.
(SB) PS2 Yes A PS2 Keyboard and Mouse controller.
(SB) SPI Yes A configurable number of Serial Peripheral Interface controllers.
(SB) SD Yes A configurable number of hardware based SPI SD controllers.
(SB) IOCTL Yes An IOCTL bus controller for MiSTer HPS-to-FPGA communication.
(SB) SOCCFG Yes A set of registers to indicate configuration of the ZPU and SoC to the controlling program.

All’interno della configurazione del SoC, elementi come l’indirizzo di partenza dello stack, il vettore di reset, l’inizio/fine IO (SB) e (WB) possono essere impostati. Con il bus Wishbone, e’ molto semplice aggiungere ulteriori dispositivi IP OpenCore; per il bus di sistema, potrebbe essere necessario un po’ di lavoro di adattamento poiche’ i dispositivi IP OpenCore utilizzano segnali diversi.

SDRAM

Il SoC supporta la SDRAM tramite due percorsi indipendenti: un controller bus di sistema (SB) (SOC_IMPL_SDRAM) e un controller bus Wishbone (WB) (SOC_IMPL_WB_SDRAM). Entrambi sono disabilitati per impostazione predefinita e possono essere abilitati indipendentemente. I parametri di temporizzazione SDRAM (tRCD, tRP, tRFC, tREF) e la geometria (Righe, Colonne, Banchi, Larghezza dati) sono tutti configurabili in zpu_soc_pkg.vhd. Il controller WB SDRAM e’ una variante con cache e accesso burst ed e’ raccomandato quando entrambi i bus sono attivi e la larghezza di banda della RAM esterna e’ critica.

Software

Il software fornito comprende:

  1. Un bootloader, I/O Control Program (IOCP). Questo e’ piu’ di un bootloader; nella sua forma base puo’ eseguire il bootstrap di un’applicazione da una scheda SD, oppure puo’ includere strumenti monitor da riga di comando e una funzione di upload seriale.
  2. Un’applicazione, ZPUTA (ZPU Test Application). E’ una suite di test e puo’ essere organizzata come applicazione singola o suddivisa in un sistema operativo basato su disco in cui tutte le funzioni sono memorizzate sulla scheda SD. ZPUTA puo’ essere avviata tramite bootstrap da IOCP o funzionare standalone come unico programma in ROM/BRAM.
  3. Un sistema operativo basato su disco, zOS (ZPU Operating System). Una versione di ZPUTA orientata al codice di produzione, con tutte le funzioni come applicazioni su disco.
  4. Funzioni di libreria in C per supportare lo sviluppo di applicazioni, incluse librerie di terze parti, es. FatFS di El. Chan.

21/04/2020: Il software per la ZPU e’ stato unificato con il tranZPUter e viene mantenuto nel repository zSoft.

Configurazione

Questa sezione mostra come configurare la ZPU e il SoC, sia per utilizzare la ZPU separatamente che come parte del SoC fornito.

Configurare la CPU


La CPU e’ configurabile tramite il file di configurazione ‘cpu/zpu_pkg.vhd’. Definisce essenzialmente la dimensione del bus di indirizzi e quali funzionalita’ hardware abilitare. La tabella seguente descrive le opzioni configurabili.

   Configuration Variable Model Values Description
  EVO_USE_INSN_BUS Evo true/false Use a separate instruction bus to connect to the BRAM memory. All other Memory and I/O operations will go over the normal bus. This option is primarily used with Dual Port BRAM, one side connected to the Instruction Bus the other side to the standard bus and will give a significant performance boost when the executed code is in this memory.
  EVO_USE_HW_BYTE_WRITE Evo true/false This option implements hardware writing of bytes, reads are always 32bit and aligned.
  EVO_USE_HW_WORD_WRITE Evo true/false This option implements hardware writing of 16bit words, reads are always 32bit and aligned.
  EVO_USE_WB_BUS Evo true/false Implement the wishbone interface in addition to the system bus.
  DEBUG_CPU All true/false Enable CPU debugging output.
  DEBUG_LEVEL All 0 to 5 Level of debugging output. 0 = Basic, such as Breakpoint, 1 =+ Executing Instructions, 2 =+ L1 Cache contents, 3 =+ L2 Cache contents, 4 =+ Memory contents, 5=+ Everything else.
  DEBUG_MAX_TX_FIFO_BITS All 2 .. ~16 Size of UART TX Fifo for debug output.
  DEBUG_MAX_FIFO_BITS All 2 .. ~16 Size of debug output data records fifo.
  DEBUG_TX_BAUD_RATE All Any Baud integer value This option sets the output Baud rate of the debug serializer transmitter, ie. 115200
  maxAddrBit All <16..31n> + WB_ACTIVE This option sets the width of the address bus.

Configurare il SoC


Il System on a Chip e’ configurabile tramite il file di configurazione ‘zpu_soc_pkg.vhd’. Le tabelle di configurazione complete per la selezione della CPU, le frequenze, gli ID CPU, la configurazione della cache, le impostazioni dei dispositivi IO, le opzioni SoC, BRAM, RAM, SDRAM, Wishbone SDRAM, Instruction BRAM, l’inizializzazione della CPU e le istruzioni hardware specifiche Evo sono identiche alla versione inglese e sono spiegate in dettaglio li’.

Build

Questa sezione mostra come effettuare un build di base e presuppone che la scheda di sviluppo di destinazione sia il QMTECH Cyclone V board. Ci sono molte opzioni di configurazione, ma queste vengono trattate separatamente.

Il modo consigliato per effettuare il build della ZPU e’ lo script di setup automatico per la vostra piattaforma (vedi Setup e build automatici qui sotto) — installa l’intera tool chain (Intel Quartus Prime Lite 17.1 e, dove necessario, Docker), clona il repository, permette di scegliere la scheda di destinazione e la variante di CPU e costruisce il bitstream FPGA fino al completamento, senza richiedere alcuna conoscenza approfondita degli strumenti. I passi manuali Build del software e Build del bitstream RTL piu’ in basso sono destinati agli utenti avanzati e ai rebuild parziali.


Setup e build automatici (consigliato)

Se volete semplicemente scaricare il repository e produrre un bitstream FPGA senza imparare l'intera tool chain, utilizzate gli script di setup inclusi. Installano tutto il necessario (Intel Quartus Prime Lite 17.1 e, dove necessario, Docker), clonano il repository se non siete gia' all'interno di un checkout, permettono di scegliere la scheda e la CPU di destinazione e costruiscono il bitstream fino al completamento. Ogni script e' autonomo: copiate solo il singolo file per la vostra piattaforma ed eseguitelo. Sono stati verificati end‑to‑end su Windows (nativo), macOS (Intel, tramite Docker) e Linux.
Script Piattaforma Note
setup_ZPU_windows.cmd Windows 10 / 11 Consigliato su Windows — launcher da doppio clic. Esegue il setup PowerShell, mantiene aperta la finestra e registra tutto in setup_ZPU_log.txt. Installazione nativa, senza WSL.
setup_ZPU_windows_native.ps1 Windows 10 / 11 Lo script PowerShell sottostante (eseguitelo direttamente da una finestra PowerShell aperta se preferite). Installa Git for Windows + Quartus 17.1 tramite winget / l’installer Intel.
setup_ZPU.sh Linux / macOS Quartus nativo su Linux (predefinito); un’immagine Docker Quartus headless autonoma su macOS (non esiste Quartus nativo per macOS — solo Mac Intel, poiche’ Quartus e’ x86-64).
build_zpu.sh tutte Wrapper di build portabile usato dagli script di setup. Rieseguitelo in qualsiasi momento per il rebuild: ./build_zpu.sh [BOARD] [CPU].

Windows 10 / 11 (nativo, senza WSL) — fate doppio clic su setup_ZPU_windows.cmd, oppure da una finestra PowerShell aperta:

# opzionale: build di un repo specifico (predefinito https://git.eaw.app/eaw/zpu.git)
$env:ZPU_REPO_URL = "https://git.eaw.app/eaw/zpu.git"
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\setup_ZPU_windows_native.ps1

Lo script usa winget per installare Git for Windows (che fornisce bash + coreutils che pilotano build_zpu.sh) e installa Quartus 17.1 (~1,9 GB) nativamente in C:\altera\17.1 — senza WSL, Docker o riavvio. La fase di copia dei file dell’installazione di Quartus puo’ sembrare bloccata per diversi minuti ma non lo e’; lasciatela terminare.

macOS / Linux — da un terminale:

chmod +x setup_ZPU.sh
./setup_ZPU.sh

Su Linux questo installa Quartus nativamente in ~/altera/17.1. Su un Mac Intel costruisce un’immagine Docker Quartus headless (Docker Desktop deve essere installato e in esecuzione) poiche’ Intel non fornisce Quartus nativo per macOS.

Ogni script chiede quale scheda di sviluppo e variante di CPU costruire (predefinito QMV / EVO) e, salvo che venga eseguito dall’interno di un checkout, dove clonare il repository. Al termine avrete, nella directory build/:

build/<BOARD>_<CPU>.sof     # FPGA configuration bit stream (e.g. build/E115_EVO.sof)
build/<BOARD>_<CPU>.rbf     # raw binary, compressed (for HPS/u-boot or serial configuration)
Schede e varianti di CPU
Schede CPU
QMV (predefinita, QMTECH Cyclone V), DE10_nano, DE0_nano, E115 (Cyclone IV E EP4CE115), CYC1000 (Cyclone 10 LP) EVO (predefinita), EVO_MINIMAL, FLEX, MEDIUM, SMALL
Rebuild successivi (senza rieseguire il setup)

Una volta installato Quartus, rieseguite direttamente il wrapper portabile. Su Windows Git Bash, mettete prima gli strumenti Quartus nel PATH:

# Solo su Windows Git-Bash:
export PATH="/c/altera/17.1/quartus/bin64":$PATH

./build_zpu.sh                    # default -> QMV_EVO
./build_zpu.sh E115 EVO           # board + CPU
./build_zpu.sh QMV_EVO            # combined BOARD_CPU form
./build_zpu.sh --list             # list all boards / CPUs
Override di ambiente utili (tutti opzionali)
Variabile Scopo Predefinito
ZPU_REPO_URL Repository da clonare https://git.eaw.app/eaw/zpu.git (pubblico)
ZPU_BOARD / ZPU_CPU Salta i prompt di scheda / CPU (prompt)
ZPU_RTL_METHOD Forza il metodo Quartus: native o docker native su Linux/Windows, docker su macOS
ZPU_DIR Build in un checkout esistente invece di clonare (clona)
ZPU_QUARTUS_BIN Punta a un bin / bin64 Quartus esistente rilevamento automatico

Ad esempio, per forzare l’immagine Docker headless su qualsiasi host, o per saltare i prompt:

ZPU_RTL_METHOD=docker ./build_zpu.sh E115 EVO     # force the headless Docker image (zpu-quartus:17.1)
ZPU_BOARD=E115 ZPU_CPU=EVO ./setup_ZPU.sh         # skip the board/CPU prompts

Il resto di questa sezione documenta il build manuale sottostante per chi preferisce eseguire gli strumenti a mano.


Build del software

Jenkins puo’ essere utilizzato per automatizzare il build, ma per una semplice compilazione utilizzate lo script build.sh e il sistema gerarchico di Makefile seguendo le istruzioni di base seguenti.

  1. Scaricare e installare la ZPU GCC ToolChain. Installare in /opt o una directory comune simile.
  2. Configurare il percorso della variabile d’ambiente.
     export PATH=$PATH:/opt/zpu/bin
    
  3. Clonare il repository ZPU Evo.
  4. Modificare il file <zpu evo dir>/software/zputa/zputa.h e selezionare le funzioni da incorporare nell’immagine core ZPUTA (per impostazione predefinita, tutte le funzioni sono costruite come applet, ma vengono ignorate quando sono incorporate nell’immagine core ZPUTA). Si seleziona una funzione impostando BUILTIN_ a '1'; impostare a '0' se non si desidera incorporarla.
  5. Decidere quale mappa di memoria si desidera e se ZPUTA deve essere un’applicazione o un bootloader, e inserire il comando di build.
     cd <zpu evo dir>/software
     ./build.sh -I 3 -O zputa -o 2 -B 0x1000 -A 0xC000
    
  6. Inserire una scheda SD nel sistema, formattarla come FAT32 e copiare i file su di essa.
     cd build/SD
     cp -r * <abs path to SD card, ie. /media/psmart/ZPU>
    


Build del bitstream RTL

Per creare il bitstream FPGA (conversione da HDL a una mappa di configurazione per l’FPGA), ci sono due metodi:

  1. Installare Intel Quartus Prime 17.1 o successivo.
  2. Aprire Quartus Prime e caricare il progetto (File -> Open Project) e selezionare <zpu evo dir>/build/QMV_zpu.qpf
  3. Compilare (Processing -> Start)

    in alternativa:-

  1. Installare Intel Quartus Prime 17.1 o successivo.
  2. Utilizzare il sistema di build Makefile con i seguenti comandi.
     cd <zpu evo dir>/build
     make QMV_EVO
    

Le istruzioni di build per ZPU Small, Medium, Flex e Evo e le note sulla configurazione di una nuova scheda di sviluppo si trovano nella versione inglese di questo documento.