[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 <stdio.h> #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; } ```