[Home](index.html) | [Vivado](vivado.htm) | [Blokovni diagram](vivado-blok.htm) | [Enostaven IP](vivado-ip.htm) | AXI IP
[SDK](sdk.htm)
# Komponenta AXI IP
Predstavili bomo izdelavo sistema s periferno komponento AXI na osnovi vzorčne komponente
iz programa **Vivado**. Naredili bomo nov projket z blokovnim diagramom, izdelali vzorčno komponento AXI IP,
jo postavili na diagram in nato z urejanjem komponente dodali želeno logiko in dokončali sistem.
## Priprava
V programu Vivado 2017 izberi **Create Project**, določi ime, npr. `blok2` in lokacijo `D:/designs/moja_mapa`.
Nato 4-krat klikni Next, da ostanejo privzete opcije, na koncu pa določi **Default Part**
s klikom na gumb Boards in izbiro `ZedBoard Zynq Evaluation and Development Kit`. V nastavitvah
(Settings, Target language) se prepričaj, da je izbran ciljni jezik VHDL.
Izberi iz menuja *Tools > Create and Package NEW IP*, klikni *Next* in izberi opcijo
*Create a new AXI4 peripheral*. V naslednjem oknu v polju Name nastavi ime vezja, npr. `axi_kvadrat`
in izberi lokacijo projektne mape (IP location), npr. `D:/designs/DIVS/blok2/ip`
V naslednjem oknu pusti privzeto izbiro 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. Z izbiro Edit IP pa bi takoj
odprli nov projekt za urejanje komponente pred pakiranjem.
## 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)
## 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 bomo dodali 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
```
end arch_imp;
Ko naredimo 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 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...).
## Testni program
```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;
}
```