140 likes | 290 Views
A verem működése fpga-n. Készítette: Labancz Anita. A verem fogalma és működése. A verem egy olyan memória terület, ahol átmenetileg adatokat tudunk tárolni.
E N D
A verem működése fpga-n Készítette: Labancz Anita
A verem fogalma és működése • A verem egy olyan memória terület, ahol átmenetileg adatokat tudunk tárolni. • A vermet tekinthetjük egy speciális „listának”, amelynek legfőbb jellemzője, hogy az utoljára beírt adatokat lehet először kiolvasni. Az adatforgalom a bemeneti sorrenddel ellenkező kimeneti sorrendű. • LIFO (LastInFirst Out) szervezésűnek is hívjuk.
A systemstack(SS) és stack pointer(SP)fogalma SYSTEM STACK • Minden mikrokontrollernek van egy rendszer verme (systemstack) • Alkalmazása • Ide tároljuk le azt a visszatérési memóriacímet, ahová vissza akarunk térni a szubrutin befejezése után • Más állapot információk tárolása interrupt bekövetkezésekor STACK POINTER • A stack pointer = veremmutató regiszter • A verem legfelső elemére mutat.
A verem műveletei • Két műveletét különböztetjük meg • PUSH: Ezzel teszünk be új értékeket a verembe ( beolvasás) • POP: Ezzel törlünk a veremből régi értékeket (kiírás) • Ha új értéket teszünk be a verembe (PUSH), akkor az SP értékét csökkentem eggyel • Ha értéket törlök a veremből (POP), akkor az SP értékét megnövelem eggyel.
A stack32x16 module bemutatása • Az FPGA-ban megosztott memóriát használunk a verem implementálásához • 16-bite szavakat tudunk tárolni benne és a verem kapacitása 32 lesz. • Ha push=1, akkor a verembe helyezett érték d[15:0] (órajel 0-ból 1-be áll) • Ha pop=1, akkor a veremből kiolvasott érték q[15:0] (órajel 0-ból 1-be áll) • A verem tetejéről írjuk ki az értéket. • Ha a pop=push=0, akkor nem történik változás (az órajel nem áll 01) • Ha a pop=push=1, ekkor a d[15:0] értéket úgy tárolom el a verem tetején (01), hogy az SP értéke nem változik (nem csökken) • Ha a verem üres, akkor empty = 1 • Ha a verem tele van, akkor a full = 1 d[15:0] stack32x16 q[15:0] clr full push pop empty clk
A stack32x16 module bemutatása • 32x16 megosztott RAM (CoreGenerator) • Az SP tartalmazza a verem tetején elhelyezett érték címét. • Hova mutasson az SP? • A verem tetején tárolt elem címére • A következő elem címére, ami üres még • Az előző részben azt állítottuk, hogy az SP értékét csökkenteni kell eggyel és azután tároljuk el az érték új címét. • Előnye: A verem tetejére mutat az SP ( amit ki tudunk venni belőle; q[15:0)] • Hátránya: Kettő órajel ciklus kell ennek a megvalósításához • 1 lépés: SP értékét csökkentjük • 2. lépés: érték új címének elmentése
A stack32x16 module bemutatása • A második lehetőséget mellett maradjunk( az üres helyre mutasson az SP) • 1. lépésben betesszük az SP által mutatott üres címre az új értéket • 2. lépésben csökkentjük az SP-t • Előnye: Egy órajel alatt elvégezhetjük a két lépést • Hátránya: Üres memória címre mutat az SP • Dual-port RAM alkalmazása • wr_addr : beleteszünk a verembe egy értékét és annak a címét letároljuk ebben, majd csökkentjük a wr_addr és az rd_addr-t • Mindig igaz lesz: wr_addr = rd_addr+1 • rd_addr : ebben tároljuk annak az elemnek a címét, amit éppen kiolvastunk (q[15:0]), majd növeljük az rd_addr és a wr_addr-t 00000 wr_addr rd_addr 11111
A stack32x16 module bemutatása stack32x16 d[15:0] dpram32x16 d[15:0] clk we clk we stack_ctrl32 asmel clr open spo[15:0] wr_addr push 0 wr2_addr a[4:0] pop rd_addr q[15:0] 1 dpo[15:0] dpra[4:0] full empty
A dpram32x16 module beállítása • Elérési útvonala • ISE DesingSiute 14.3 • New project… • IP(CoreGenerator&ArchitectureWizard) • ViewbyNamefül • DistributedMemorygenerator
A stack32x16 module bemutatása • Ha a we=1, akkor az órajel(clk) 01, az érték d[15:0], és a címe: a[4:0] • Kimenet: spo[15:0] ez az az érték ami a[4:0] van tárolva a címe, • dpo[15:0] pedig az az érték, aminek a címe a dpra[4:0] van. Multiplexer • wr_addr és az rd_addr: vagy az egyik vagy a másik tárolja a write címét. Ez függ: • Ha push=1 wr_addr • Ha push = 1 és pop = 1rd_addr