[LNIV Xilinx](index.html) | [Vivado](vivado.htm) | [blokovni diagram](vivado-blok.htm) | [komponente IP](vivado-ip.htm) | AXI IP | [SW](sw.htm)
# Komponenta AXI-Lite
Programirljivi sistemi na čipu vsebujejo komponente z vmesnikom AXI za pospešitev izvajanja algoritma v FPGA logiki.
**Vivado** ima orodje IP Packager v katerem:
* zapakiramo VHDL/Verilog modele vezij s signali, ki jih orodje prepozna kot AXI vmesnik, ali pa
* uporabimo generator vzorčnih komponent, ki jih po potrebi predelamo.
Predstavili bomo izdelavo enostavne periferne komponente z vmesnikom AXI-Lite iz vzorčne komponente.
Naredili bomo nov projekt, izdelali vzorčno komponento, jo postavili na diagram in nato z urejanjem
dodali želeno logiko in dokončali sistem.
## Vzorčna komponenta
Za izdelavo vzorčne komponente moramo imeti v programu **Vivado** odprt nov projekt v katerem je
nastavljeno ciljno programirljivo vezje ali plošča. V nastavitvah izberemo privzeti strojno-opisni
jezik, npr. Settings, Target language, VHDL.
V meniju *Tools > Create and Package NEW IP* klikni *Next* in izberi opcijo
*Create a new AXI4 peripheral*. V naslednjem oknu določi ime vezja (Name, `axi_kvadrat`)
in lokacijo projektne mape (IP location), npr. `C:/proj/ip`.
V naslednjem oknu naj ostane privzeta izbira nastavitev perifernega vmesnika: AXI Lite s 4 registri.
![](./img/vivado_axi_if.png)
V zadnjem oknu pustimo privzeto možnost: Add IP to the repository, da bo vzorčna komponenta takoj
na voljo za blokovni diagram. Z izbiro Edit IP pa bi takoj odprli projekt za urejanje komponente pred pakiranjem.
## Vključitev komponente v blokovni diagram
V meniju na levi klikni **Create Block Design**, da se odpre novo okno za risanje blokovnega diagrama.
Klikni na Add IP (ikona + ali ctrl+i), v polje Search zapiši `Zynq` in izberi `ZYNQ7 Processing System`.
S klikom na **Run Block Automation** naredi zunanje povezave procesorja (DDR in FIXED IO).
Dodaj v diagram še novo komponento AXI: Add IP in v Search vnesi `kvad`, nato pa klikni na
**Run Connection Automation**, da bo program dodal AXI Interconnect in Processor System Reset ter
naredil ustrezne povezave.
![](./img/Vivado_axi_blok.png)
Če iskalnik ne najde naše komponente, moramo ustrezno nastaviti repozitorij, ki bo kazal na mapo
z opisom komponente IP. Odpremi nastavitve (Settings) in določimo mapo pod Project Settings, IP, Repository.
![](./img/Vivado_Repository.png)
Na blokovni shemi so prikazana vodila (AXI, AXI-Lite) in glavni krmilni signali (ura, reset). Ostale signale vodila prikažemo s klikom na + znotraj komponente. Postavitev sheme izboljšamo z ikono Regenerate Layout, na voljo pa je tudi strnjena shema, kjer so prikazana le vodila: Show interface connections only. Primer diagrama z dvema komponentama s povezavo AXI-Lite:
![](./img/Vivado_Kvadrat2.png)
V zavihku Address Editor vidimo naslovni prostor, ki ga Vivado avtomatsko dodeli komponentam.
Dekodiranje odmika naslova (Offset Address) je samodejno narejeno v komponenti AXI Interconnect.
![](./img/Vivado_Kvadrat2a.png)
## Urejanje in ponovno pakiranje komponente IP
Logiko komponente IP iz blokovnega diagrama uredimo tako, da z desnim klikom na komponento izberemo
Edit IP in Packager in potrdimo lokacijo začasnega projekta. S tem korakom odpremo nov projekt v
programu **Vivado**, kjer lahko urejamo VHDL kodo v Design Sources.
V periferno enoto s štirimi registri dodajmo logiko, ki izračuna kvadrat vrednosti iz prvega registra.
Opis komponente AXI IP je v datoteki: axi_kvadrat_v1_0.vhd, v kateri je vključena axi_kvadrat_v1_0_S00_AXI.vhd.
Z dvoklikom na ime datoteke v Design Sources odpri axi_kvadrat_v1_0_S00_AXI in dodaj deklaracijo dveh
signalov v arhitekturni stavek:
```vhdl
architecture arch_imp of axi_kvadrat_v1_0_S00_AXI is
signal x: unsigned(15 downto 0);
signal y: unsigned(31 downto 0);
```
Predzadnji proces v opisu vezja predstavlja dekodiranje naslovov in branje registrov.
V tem procesu zamenjaj register slv_reg0 s signalom y, ki ga je potrebno pretvoriti v std_logic_vector.
```vhdl
-- Address decoding for reading registers
loc_addr := axi_araddr(ADDR_LSB + OPT_MEM_ADDR_BITS downto ADDR_LSB);
case loc_addr is
when b"00" =>
reg_data_out <= std_logic_vector(y); -- namesto slv_reg0
when b"01" =>
reg_data_out <= slv_reg1;
```
Na koncu dodaj še logiko, ki poveže signal x s prvim registrom (uporabimo le 16 bitov) in izračuna kvadrat:
```vhdl
-- Add user logic here
x <= unsigned(slv_reg0(15 downto 0));
y <= x * x;
-- User logic ends
```
Ko dokončamo spremembe, odpremo zavihek Package IP, izberemo korak File Groups in potrdimo
Merge changes from File Groups Wizard. Nato izberemo korak Review and Package in kliknemo **Re-Package IP**,
ki ponovno zapakira komponento in zapre začasni projekt.
## Izdelava digitalnega sistema
Ko se vrnemo na projekt z blokovnim diagramom, moramo najprej osvežiti komponento. Izberemo iz menuja
Tools > Report > Report IP Status, da se na spodnjem oknu odpre zavihek IP Status, ki zahteva nadgradnjo
spremenjene komponente.
![](./img/Vivado_upgrade_ip.png)
Nadgradnjo potrdimo s klikom na gumb **Upgrade Selected**, ki takoj nato odpre
novo okno, kjer kliknemo **Generate**. Nato zaključi opis sistema: izberi zavihek *Hierarchy*
in v *Design Sources* z desnim gumbom klikni na datoteko diagrama design_1,
izberi **Create HDL Wrapper** ter potrdi privzeto izbiro (Let Vivado manage...).
Sistem je sedaj pripravljen za prevajanje in izdelavo datoteke za FPGA (bitstream).
## Testni program
Do registrov komponente z vodilom AXI-Lite dostopa programska oprema tako, da vpisuje ali
bere komponenti dodeljene periferne naslove. Naslov prvega registra (BASEADDR) je definiran v knjižnici
**xparameters.h**. Primer testnega programa:
```C
#include
#include "xparameters.h"
#include "xil_io.h"
int main()
{
int y;
Xil_Out32(XPAR_AXI_KVADRAT_0_S00_AXI_BASEADDR, 5); // nastavi x = 5
y = Xil_In32(XPAR_AXI_KVADRAT_0_S00_AXI_BASEADDR); // beri y = x*x
return 0;
}
```