12.1.1. A Picoblaze Core implementálása FPGA-ba A Picoblaze processzor Ebben a fejezetben kerül bemutatásra a Pikoblaze-zel való munka. A Picoblaze szoftveres processzort alkotója Ken Chapman a Xilinx vállalatból. Az itt bemutatásra kerülő változat Verilog nyelven a Spartan6 FPGA-ra lett írva. A Picoblaze egy ingyenes szoftvercsomagban érkezik, amely tartalmazza a szoftveres processzor forráskódját, valamint az összes szükséges programot és dokumentációt. A tananyag követéséhez, ebben a fejezetben a következő anyagokra lesz szükség: Xilinx Webpack 13.1-as vagy újabb fejlesztőeszköz, le kell tölteni a Picoblaze KCPSM6 -t a Xilinx honlapjáról, ##LINK: www.xilinx.com/picoblaze ## a Xilinx szoftver eszközök által támogatott JTAG programozó. A Xilinx honlapjáról letöltött KCPSM6_Release4_30April12.zip fájl tartalmazza a Pikoblazeval való munkához szükséges minden elemet. A tömörített csomagban található a KCPSM6_User_Guide_30April12.pdf részletes leírást tartalmaz a Picoblaze változatos használatával kapcsolatban. Az anyagokban megtalálható a szoftveres processzor Verilog és VHDL nyelvű kivitelezése is. A következőkben csak a szükséges alapvető lépések lesznek bemutatva. Ezek segítségével lehet megismerni ezt a 8 bites szoftveres processzort. A későbbiekben eme kezdeti lépések és az említett PDF anyag alapján lehet tovább ismerkedni a Picoblaze-zel. Gyakran felteszik a kérdést: mi értelme és célja megvalósítani egy kis szoftveres processzort a komplex FPGA áramkörön belül? Erre az egyik lehetséges válasz a következő: az FPGA áramkör hatékonyan meg tud valósítani összetett párhuzamos logikai struktúrákat, amelyek zökkenőmentesen és nagy sebességgel tudják elvégezni a feladataikat. Ezek a logikai/vezérlési struktúrák véges automaták útján vannak megvalósítva. És ezen a ponton leljük meg a probléma lényegét: nevezetesen, rendkívül nehéz, összetett véges állapotú gépeket tervezni. Ebből a szempontból, egy kicsi és szekvenciálisan működő processzor használata nagyon kényelmes és egyszerű megoldás. Az FPGA áramkörbe betölthető processzorok száma csak az FPGA áramkör kialakításától és erőforrásaitól függ. Az 1. ábrán a Pikoblaze szoftveres, 8 bites processzor felépítése van bemutatva.
1. ábra a Picoblaze szoftveres processzor felépítése Ahhoz, hogy a Picoblaze (KCPSM6) szoftveres processzort használhassák, elegendő csak két fájlt csatolni a projekthez: kcpsm6.v amely definiálja a processzort és a portjait, egy adatfájlt, amely egy memóriát definiál, amely tartalmazza azt a programkódot amit a szoftveres processzornak futtatnia kell. Ez az adatfájl a következő alakokban adható meg: Verilog, VHDL, vagy IP mag. Feladat: Írjon egy olyan Picoblaze processzor programot, amely az egyik kimeneten egy LED-et villogtat! Az elészült programot és egy Picoblaze szoftveres processzort helyezze el egy Spartan6-os FPGA áramkörben! Megoldás: 1. lépés: meg kell írni és le kell fordítani a Picoblase szoftveres processzor programját. A programot assemblyben kell megírni. Írja be egy újonnan létrehozott szövegfájlba a következő assembly programot:
start: LOAD S9, 00 ; az S9 betöltése drive_wave: OUTPUT S9, 02 ; az S9 regiszter kiiratása az ; userbit-be LOAD S2, 0F ; az S2 kezdőértéke loop2: LOAD S1, FF ; az S1 kezdőértéke loop1: LOAD S0, FF ; az S0 kezdőértéke loop0: SUB S0, 01 ; csökkentjük S0-át 1-el JUMP NZ, loop0 ; ugrás ha még nem nulla SUB S1, 01 ; csökkentjük S1-et 1-el JUMP NZ, loop1 ; ugrás ha még nem nulla SUB S2, 01 ; csökkentjük S2-őt 1-el JUMP NZ, loop2 ; ugrás ha még nem nulla ; XOR S9, FF ; negáljuk a regiszter bitjeit JUMP drive_wave ;feltétel nélküli ugrás az elejére A fájlt psm kiterjesztéssel pl. LED.PSM mentse el! 2. lépés: az elkészült programot le kell fordítani és el kell helyezni egy virtuális memóriában, amiből a szoftveres processzor kiolvashatja és futtathatja. A már említett KCPSM6_Release4_30April12.zip adattárban található a fordítóprogram (kcpsm6.exe) és a memória definícióját tartalmazó Verilog fájl (ROM_form.v).
Helyezze el az asszembly forráskódot tartalmazó LED.PSM valamint a ROM_form.v adatfájlokat és a fordítóprogramot egy közös könyvtárban! Indítsa el a kcpsm6.exe fordítóprogramot, majd adja meg a forráskódot tartalmazó fájl nevét (LED.PSM)! (2. ábra) A fordítóprogram lefordítja az assembly forráskódot, majd az eredményt összefűzi a ROM memóra definíciójával. Így keletkezik a kimeneten egy Verilog fájl: a LED.v. A feladat további részében erre a fájlra lesz szükségünk. 2. ábra az assembly forráskód fordítása 3. lépés: A Xilinx ISE fejlesztőkörnyezetben létre kell hozni a rendelkezésre álló hardverplatformnak megfelelő projektust. Ez a folyamat az előző fejezetek során lépésről-lépésre, részletesen be lett mutatva. Majd a szükséges fájlokat kell bemásolni a projektus munkakönyvtárába. Ezután létre kell hozni a legfelső szintű Verilog fájlt. Hozzon létre egy új projektust a Xilinx ISE-ben! (Ebben a példában Mars-MX2-es platform lett használva.) Ezután másolja be a led.v és a kcpsm6.v fájlokat az újonnan létrehozott projektus munkakönyvtárába!
Hozza létre a legfelső szintű Verilog fájlt amelybe másolja vagy gépelje be a következőket! : (Megjegyzés: a következő verilog fájl a kcpsm6_design_template.v fájl alapján íródott) //************************************************* module picoblaze_toggle( input ireset, input iclk, output oled0 ); clock = iclk; // reset is active high. // if no reset signal input // then tie reset to zero here. [11:0] address; [17:0] instruction; bram_enable; [7:0] port_id; [7:0] out_port; reg [7:0] in_port; write_strobe; k_write_strobe; read_strobe; interrupt; interrupt_ack; kcpsm6_sleep; kcpsm6_reset = ireset; cpu_reset; rdl = ireset; kcpsm6 #(.interrupt_vector (12'h3FF),.scratch_pad_memory_size(64),.hwbuild (8'h00)) processor (.address (address),
.instruction (instruction),.bram_enable (bram_enable),.port_id (port_id),.write_strobe (write_strobe),.k_write_strobe (k_write_strobe),.out_port (out_port),.read_strobe (read_strobe),.in_port (in_port),.interrupt (interrupt),.interrupt_ack (interrupt_ack),.reset (kcpsm6_reset),.sleep (kcpsm6_sleep),.clk (clock)); assign kcpsm6_sleep = 1'b0; assign interrupt = 1'b0; led #(.C_FAMILY ("S6"), //Family 'S6' or 'V6'.C_RAM_SIZE_KWORDS (1), //Program size '1', '2' or '4'.C_JTAG_LOADER_ENABLE (0)) //Include JTAG Loader when '1' led ( //Name to match your PSM file.rdl (rdl),.enable (bram_enable),.address (address),.instruction (instruction),.clk (clock)); // only one bit written to by picoblaze, the LED. // therefore don't need to decode port_id. // if write_strobe asserts, grab out_port[0] and // hold it in userbit. reg userbit = 0; always @(posedge clock) begin
if(write_strobe) begin userbit <= out_port[0]; end end assign oled0 = userbit; endmodule //************************************************* 4. lépés: Mint minden processzornak a Picoblase-nek is szüksége van órajelre és reszet jelre, ezen felül a feladat megvalósítása megkövetel egy kimenti jelet is, amellyel a LED-et lehet vezérelni. Ezért létre kell hozni a belső magot a külvilággal összekötő UCF fájlt. Hozza létre az UCF fájlt amelybe másolja vagy gépelje be a következőket! : NET "oled0" NET "iclk" NET "ireset" LOC = "F15" IOSTANDARD = "SSTL18_II"; LOC = "R8" IOSTANDARD = "LVCMOS33" FAST; LOC = "T2" IOSTANDARD = "LVCMOS33" FAST; 5. lépés Fordítsa le a projektust! Az eredmény bit-fájlt, a Xilinx Impact program segítségével programozza be az FPGA-ba! A lépések rövid összefoglalója: 0) A Xilinx honlapjáról le kell tölteni a KCPSM6_Release4_30April12.zip csomagot 1) Meg kell írni a led.psm fájlt, amelyet azonos könyvtárba kell elhelyezni a ROM_form.v fájllal és a kcpsm6.exe fordítóprogrammal. Elvégezni a PSM fájl fordítását. 2) Az ISE projektkönyvtárba mésolni a led.v és kcpsm6.v fájlokat és elkészíteni a legfelső szintű Verilog fájlt, pl. picoblaze_villog.v. Ehhez fel lehet használni a csomagban található kcpsm6_design_template.v sablont. 3) Meg kell írni a hardverplatformnak megfelelő UCF fájlt. 4) A projektus fordítása után a bit-fájlt a Xilinx Impact segítségével be kell tölteni a Spartan6 eszközbe.