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 ); wire clock = iClk; // reset is active high. // if no reset signal input // then tie reset to zero here. wire
[11:0]
address;
wire
[17:0]
instruction;
wire
bram_enable;
wire
[7:0]
port_id;
wire
[7:0]
out_port;
reg
[7:0]
in_port;
wire
write_strobe;
wire
k_write_strobe;
wire
read_strobe;
wire
interrupt;
wire
interrupt_ack;
wire
kcpsm6_sleep;
wire
kcpsm6_reset = iReset;
wire
cpu_reset;
wire
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"
LOC = "F15" | IOSTANDARD = "SSTL18_II";
NET "iClk"
LOC = "R8"
| IOSTANDARD = "LVCMOS33" | FAST;
NET "iReset"
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.