FPGA & Verilog ismertetı. BME Méréstechnika és Információs Rendszerek Tanszék

Hasonló dokumentumok
LOGIKAI TERVEZÉS HARDVERLEÍRÓ NYELVEN. Előadó: Dr. Oniga István

PROTOTÍPUSKÉSZÍTÉS. Előadó: Dr. Oniga István

Fehér Béla Szántó Péter, Lazányi János, Raikovich Tamás BME MIT FPGA laboratórium

Laborgyakorlat 3 A modul ellenőrzése szimulációval. Dr. Oniga István

Kombinációs áramkörök modelezése Laborgyakorlat. Dr. Oniga István

Verilog ismertető (Szántó Péter, BME MIT, )

Hardver leíró nyelvek (HDL)

Szántó Péter BME Méréstechnika és Információs Rendszerek Tanszék, FPGA Labor

LOGIKAI TERVEZÉS PROGRAMOZHATÓ. Elő Előadó: Dr. Oniga István

5. KOMBINÁCIÓS HÁLÓZATOK LEÍRÁSÁNAK SZABÁLYAI

Újrakonfigurálható eszközök

Digitális Technika. Dr. Oniga István Debreceni Egyetem, Informatikai Kar

Dr. Oniga István DIGITÁLIS TECHNIKA 8

DIGITÁLIS TECHNIKA 13. Dr. Oniga István

Verilog HDL ismertető 2. hét : 1. hét dia

LOGIKAI TERVEZÉS HARDVERLEÍRÓ NYELVEN. Dr. Oniga István

Előadó: Nagy István (A65)

Verilog HDL ismertető 4. hét : hét dia

Szimuláció és verifikáció. Digitális rendszerek tervezése FPGA áramkörökkel Szimuláció és verifikáció. Kétfajta szimulációs módszer

Digitális rendszerek tervezése FPGA áramkörökkel Verilog RTL kódolás

A Verilog HDL áttekintése

LOGIKAI TERVEZÉS HARDVERLEÍRÓ NYELVEN. Dr. Oniga István

Digitális technika II. (vimia111) 5. gyakorlat: Tervezés adatstruktúra-vezérlés szétválasztással, vezérlőegység generációk

Digitális rendszerek tervezése FPGA áramkörökkel Szimuláció és verifikáció

Budapesti Műszaki és Gazdaságtudományi Egyetem. A Verilog HDL II. Nagy Gergely. Elektronikus Eszközök Tanszéke (BME) szeptember 26.

Verilog HDL ismertető

Dr. Oniga István DIGITÁLIS TECHNIKA 9

Digitális technika (VIMIAA02) Laboratórium 5

Digitális technika (VIMIAA02) Laboratórium 5

Újrakonfigurálható eszközök

Újrakonfigurálható eszközök

Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD)

Digitális technika (VIMIAA02) Laboratórium 4

A LOGSYS GUI. Fehér Béla Raikovich Tamás, Laczkó Péter BME MIT FPGA laboratórium

LOGIKAI TERVEZÉS HARDVERLEÍRÓ NYELVEN. Előadó: Dr. Oniga István

1. Kombinációs hálózatok mérési gyakorlatai

DIGITÁLIS TECHNIKA 7. Előadó: Dr. Oniga István

Digitális technika VIMIAA02

Digitális technika (VIMIAA02) Laboratórium 4

Egyszerű RISC CPU tervezése

Digitális technika VIMIAA02

Digitális technika (VIMIAA02) Laboratórium 3

7.hét: A sorrendi hálózatok elemei II.

Egyszerű mikroprocesszor RTL modellek (VHDL)

Digitális technika (VIMIAA02) Laboratórium 3

Újrakonfigurálható technológiák nagy teljesítményű alkalmazásai

DIGITÁLIS TECHNIKA I

HDL nyelvek: VHDL. Fehér Béla Szántó Péter, Lazányi János, Raikovich Tamás BME MIT FPGA laboratórium

A feladatokat önállóan, meg nem engedett segédeszközök használata nélkül oldottam meg: Olvasható aláírás:...

Újrakonfigurálható eszközök

Verilog HDL ismertető

Kiegészítő segédlet szinkron sorrendi hálózatok tervezéséhez

LOGSYS EGYSZERŰ ALKALMAZÁS KÉSZÍTÉSE A LOGSYS KINTEX-7 FPGA KÁRTYÁRA A XILINX VIVADO FEJLESZTŐI KÖRNYEZET HASZNÁLATÁVAL június 16. Verzió 1.

Digitális technika (VIMIAA01) Laboratórium 4

Mérési jegyzőkönyv. az ötödik méréshez

Programozás és digitális technika II. Logikai áramkörök. Pógár István Debrecen, 2016

10. EGYSZERŰ HÁLÓZATOK TERVEZÉSE A FEJLESZTŐLAPON Ennél a tervezésnél egy olyan hardvert hozunk létre, amely a Basys2 fejlesztőlap két bemeneti

Tervezési módszerek programozható logikai eszközökkel

A Picoblaze Core implementálása FPGA-ba

11. KÓDÁTALAKÍTÓ TERVEZÉSE HÉTSZEGMENSES KIJELZŐHÖZ A FEJLESZTŐLAPON

Digitális technika Xilinx ISE GUI használata

Szekvenciális hálózatok és automaták

DIGITÁLIS TECHNIKA. Szabó Tamás Dr. Lovassy Rita - Tompos Péter. Óbudai Egyetem Kandó Kálmán Villamosmérnöki Kar LABÓRATÓRIUMI ÚTMUTATÓ

Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD)

6. hét: A sorrendi hálózatok elemei és tervezése

Újrakonfigurálható eszközök

A VERILOG HARDVER LEÍRÓ NYELV ALKALMAZÁSA A LOGIKAI SZINTÉZISBEN

DIGITÁLIS TECHNIKA 8 Dr Oniga. I stván István

LOGSYS LOGSYS ECP2 FPGA KÁRTYA FELHASZNÁLÓI ÚTMUTATÓ szeptember 18. Verzió

Újrakonfigurálható eszközök

Tartalom Tervezési egység felépítése Utasítások csoportosítása Értékadás... 38

Hobbi Elektronika. A digitális elektronika alapjai: Újrakonfigurálható logikai eszközök

8.3. AZ ASIC TESZTELÉSE

Beágyazott és Ambiens Rendszerek Laboratórium BMEVIMIA350. Mérési feladatok az 1., 2. és 3. mérési alkalomhoz

Digitális Technika. Dr. Oniga István Debreceni Egyetem, Informatikai Kar

Dr. Oniga István DIGITÁLIS TECHNIKA 9

A Xilinx FPGA-k. A programozható logikákr. Az FPGA fejlesztés s menete. BMF KVK MAI, Molnár Zsolt, 2008.

A gyakorlatokhoz kidolgozott DW példák a gyakorlathoz tartozó Segédlet könyvtárban találhatók.

ISE makró (saját alkatrész) készítése

Bev Be e v z e e z t e ő t az ISE re r nds nds e z r e használatához

Digitális Technika. Dr. Oniga István Debreceni Egyetem, Informatikai Kar

funkcionális elemek regiszter latch számláló shiftregiszter multiplexer dekóder komparátor összeadó ALU BCD/7szegmenses dekóder stb...

3.6. HAGYOMÁNYOS SZEKVENCIÁLIS FUNKCIONÁLIS EGYSÉGEK

következő: 2.)N=18 bites 2-es komplemens fixpontos rendszer p=3 Vmin+ =delta r=2^(-p)=2^(-3)=

A MiniRISC processzor

Végh János Bevezetés a Verilog hardver leíró nyelvbe INCK??? előadási segédlet

Joint Test Action Group (JTAG)

Digitális technika VIMIAA01 5. hét

Elektronika, 5. gyakorlat: algoritmikus C szintézis

Digitális eszközök típusai

LOGIKAI TERVEZÉS. Előadó: Dr. Oniga István Egytemi docens

Xilinx ChipScope ismertető

Digitális technika VIMIAA01 5. hét Fehér Béla BME MIT

III. Alapfogalmak és tervezési módszertan SystemC-ben

Rendszerszintű tervezés: SystemC I.

Digitális technika II. (vimia111) 5. gyakorlat: Mikroprocesszoros tervezés, egyszerű feladatok HW és SW megvalósítása gépi szintű programozással

Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD)

HDL tervezés. Gábor Bata FPGA Developer Microwave Networks Ericsson Hungary Ltd.

MIKROELEKTRONIKA, VIEEA306

Hobbi Elektronika. A digitális elektronika alapjai: További logikai műveletek

Átírás:

FPGA & Verilog ismertetı BME Méréstechnika és Információs Rendszerek Tanszék

FPGA-k FPGA: Field Programmable Gate Array programozható logikai áramkör Jelentısebb gyártók: Xilinx, Altera, Actel, Quicklogic, Lattice Jellemzık A funkciót, mőködést a konfiguráció határozza meg A konfiguráció esetleg módosítható, törölhetı Komplexitás 50000 8000000 kapu 100 600 I/O láb 100 400 MHz mőködés (terv függı) Felépítés lehet pl. RAM alapú, MUX alapú

Xilinx FPGA-k Több család Spartan: hatékony, optimalizált struktúra Virtex: speciális funkciók, gyorsabb, komplexebb, gazdagabb funkcionalitás Felépítés: CLB: logikai blokk IOB: I/O blokk BlokkRAM: belsı memória Szorzó Huzalozás

Xilinx FPGA: Alap logikai elem Logikai elem (Slice): 2 LUT + 2 FF + kiegészítı logika LUT: Look-Up Table 16x1 bites memória Cím: a logikai függvény bemeneti változói Tartalom: Karnaugh tábla Bármilyen négy bemenető, egy kimenető logikai függvény megvalósítható

Xilinx FPGA-k Részlet egy kész tervbıl: logikai blokkok + huzalozás

Xilinx FPGA-k: a logikai elem részletei

Xilinx FPGA: konfiguráció A konfigurációt (LUT tartalom, huzalozás, csatlakozások, egyéb paraméterek) SRAM tárolja Tápfeszültség kikapcsolásakor elveszíti a konfigurációt Bekapcsolás után konfiguráció szükséges EEPROM-ból, automatikusan Fejlesztıi kábel segítségével ún. JTAG porton keresztül

Szabvány HDL nyelvek Szabványos HDL (hardware description language) nyelvek Verilog 1984: Gateway Design Automation Inc. 1990: Cadence -> Open Verilog International 1995: IEEE szabványosítás 2001: Verilog 2001 VHDL 1983-85: IBM, Texas Instruments 1987: IEEE szabvány 1994: VHDL-1993

Egyéb HDL HDL fejlesztés a szoftver fejlesztéshez viszonyítva továbbra is idıigényes Sok fejlesztı rendelkezik C/C++ ismerettel, viszonylag kevés HDL ismerettel Magasszintő hardver leíró nyelvek Celoxica Handel-C: C alapú, spec. kiegészítések SystemC: szabványos, ma már (részben) szintetizálható, C++ alapú Mentor Catapult-C: C++ kiegészítések nélkül Gyorsabb szimuláció/verifikáció HW/SW együttes tervezés

HDL nyelvek célja Hardver modellezés Mindkét nyelv jelentıs része csak a hardver funkciók modellezésére ill. szimulációra használható Szintetizálható részhalmaz szintézer függı Kapuszintő modulokból építkezı, kapcsolási rajzon alapuló tervezési módszerek leváltása RTL (Register Transfer Level) szintő leírás Automatikus hardver szintézis a leírásból Tervezıi hatékonyság növelése

HDL nyelvek Alapvetıen moduláris felépítéső tervezést tesz lehetıvé HDL modul Be-, kimenetek definiálása Be-, kimenetek közötti logikai kapcsolatok és idızítések definiálása NEM szekvenciálisan végrehajtódó szoftver Alapvetıen idıben párhuzamos, konkurrens mőködést ír le

Verilog Modulok

Modulok Építıelem komplex rendszerek létrehozására Hierarchikus leírás, feladat partícionálás

Verilog 2001 Module module kulcsszó endmodule kulcsszó module something( input clock, input reset, input [7:0] bus_in, output [7:0] bus_out, ); always @ (posedge clock) if (reset) bus_out <=0; else bus_out <= bus_in; endmodule module név Modul bemeneti portjai Modul kimeneti portjai Kívánt funkcionalítás

... wire clock, reset; wire local_bus_in, local_bus_out; something inst_name (.clock (clock),.reset (reset),.bus_in (local_bus_in),.bus_out (local_bus_out) ); Modul használat Almodulban deklarált változó Itteni változó

Strukturális leírás Hierarchia felépítése: modulok összekapcsolása module top_level (input in0, in1, in2, output r); wire xor0; xor_m xor_inst0(.i0(in0),.i1(in1),.o(xor0)); xor_m xor_inst1(.i0(xor0),.i1(in2),.o(r)); endmodule in0 in1 xor_m i0 i1 o xor_inst0 xor_m i0 i1 o xor_inst1 r in2

Verilog alapok

Szintaktika Megjegyzések (mint C-ben) // egy soros /* */ több soros Konstansok <bitszám>< alap><érték> 5 b00_100: 00100 decimális érték: 4, 5 bites 8 h4e: 01001110 decimális érték: 78, 8 bites 4 bz: ZZZZ nagy impedanciás, kikapcsolt állapot

Bitmőveletek ~, &,, ^, ~^ (negálás, és, or, xor, xnor) Vektorokon bitenként értelmezett, pl: 4 b1101 & 4 b0110 = 4 b0100 Ha a két operandus szélessége nem egyezik meg, a kisebbik az MSB biteken 0-val kiterjesztve 2 b11 & 4 b1101 = 4 b0001 (Logikai operátorok:!, &&, )

Komparátor operátorok C-szintakszissal megegyezı Egyenlıség, nem egyenlıség ==,!= ===: egyenlıség az x, z értékek figyelembevételével!==: nem egyenlı, x, z figyelembevételével Összehasonlítás <, >, <=, >=

Aritmetikai operátorok C-szintakszissal megegyezı Operátorok: +, -, *, /, % Nem mindegyik szintetizálható Szintézer függı, de tipikusan az osztás pl. csak akkor, ha az osztó kettı hatvány Negatív számok kettes komplemens kódban

Egyéb operátorok Konkatenálás (összefőzés): {} Pl.: {4 b0101, 4 b1110} = 8 b01011110 Shift operátor <<, >> Bit kiválasztás Tartomány kiválasztó kifejezés konstans data[5:3]

Bit redukciós operátorok Egy vektor összes bitjén végeznek mőveletet, eredményük egy bites érték &, ~&,, ~, ^, ~^ (és, nem és, vagy, nem vagy, xor, xnor) &4 b1101 = 1 b0 4 b1101 = 1 b1 Tipikus alkalmazások: Számláló végérték feltételek, Paritásvizsgálat ALU mővelet eredmény jelzés

Verilog misztika wire - reg assign - always

Carry OUT Comb. OUT Adattípusok L U T I N 4 LUT Carry + MUX FF FF OUT MUX IN Wire assign Nevének megfelelıen viselkedik (vezeték) Pl. 8 bites vezeték: wire [7:0] data; Carry IN Reg always Szintézis utáni eredmény nem mindig regiszter Vezeték Flip-flop Latch Pl.: reg [7:0] data; Assign - kombinációs Always @ (*) - kombinációs Always @ ( _wire_) kombinációs Always @ (posedge clk) regiszter

Assign Kombinációs logika assign-nal csak wire típusú változónak lehet értéket adni Folyamatos értékadás A bal oldali változó folyamatosan kiértékelıdik Pl. assign c = a & b; a b c Egy változó csak egy assign által kaphat értéket assign értékadások egymással párhuzamosan mőködnek (hardver) Kombinációs logika leírására alkalmas

Always két esete Kombinációs logika always @ (a, b) c <= a & b; always @ (*) c <= a & b; a b c Flip-Flop always @ (posedge clk) c <= a & b; clk a b D[0] Q[0] c

Always blokk finomságok Szintakszis: always @ (.) begin.... end Érzékenységi lista Blokkon belüli mőveletek Egy változó csak egy always blokkban kapjon értéket always blokk nem lehet érzékeny a saját kimenetére always blokkon belül ne használjunk assign értékadást Az always blokkok egymással (és az assign típusú értékadásokkal) párhuzamosan mőködnek

Always Flip Flop Flip Flop: élérzékeny tároló always @ (posedge clk) c <= a & b; Szinkron reset clk a b D[0] Q[0] c always @ (posedge clk) if (rst) c <= 1'b0; else c <= a & b; clk a b rst D[0] R Q[0] c Aszinkron reset always @ (posedge clk, posedge rst) if (rst) c <= 1'b0; else c <= a & b;

Always Flip Flop Xilinx FPGA-kban A reset, set lehet szinkron, illetve aszinkron Szinkron eset prioritás: reset, set, ce Aszinkron reset/set példa: always @ (posedge clk, posedge rst, posedge set) if (rst) c <= 1'b0; else if (set) c <= 1'b1; else if (ce) c <= a & b;

Always latch Latch: szintvezérelt tároló: amíg a gate bemenete 1, addig mintavételezi az adatbemeneteket always @ (*) If (g) c <= a & b; a b g D[0] C lat c Q[0] c

Always latch hiba Latch véletlen létrehozása Nem teljes if vagy case szerkezet Szintézer általában figyelmeztet always @ (*) case (sel) 2 b00: r <= in0; 2 b01: r <= in1; 2 b10: r <= in2; endcase sel[1:0] in0 [1:0] [0] [0] 0 1 always @ (*) if (sel==0) r <= in0; else if (sel==1) r <= in1; else if (sel==2) r <= in2; in1 in2 [1] [1] [0] 0 1 LD D G Q r r

Always helyesen Helyes kód always @ (*) case (sel) 2 b00: r <= in0; 2 b01: r <= in1; 2 b10: r <= in2; default: r <= bx; endcase always @ (*) if (sel==0) r <= in0; else if (sel==1) r <= in1; else r <= in2;

Always értékadás Blokkoló értékadás: = Kiértékelıdéséig blokkolja az utána következı értékadásokat -> szekvenciális utasítás végrehajtás Nem-blokkoló értékadás: <= A nem-blokkoló értékadások párhuzamosan hajtódnak végre Blokkoló nem-blokkoló példa késıbb Nem-blokkoló értékadás használata javasolt

Blokkoló nem blokkoló reg t, r; always @ (posedge clk) begin t = a & b; r = t c; end clk c a b D[0] r Q[0] r reg t, r; always @ (posedge clk) begin t <= a & b; r <= t c; end clk c a b D[0] Q[0] t D[0] r Q[0] r

Blokkoló nem blokkoló Pl. 3 bemenető összeadó reg s0, s1; always @ (posedge clk) begin s0 = in0 + in1; s1 = s0 + in2; end reg s2, s3; always @ (posedge clk) begin s2 <= in0 + in1; s3 <= s2 + in2; end reg s4; always @ (posedge clk) begin s4 <= in0 + in1 + in2; end In0 In1 In2 s0 s1 2 4 5 6 6 9 3 15 11 18 In0 In1 In2 s2 s3 2 4 5 6 9 3 6 15 9 In0 In1 In2 2 4 5 6 9 3 s4 11 18

Tervezési tanácsok: Praktikák 1 modul, egy funkcióért felelıs (pl. órajel generátor, összeadó blokk, szőrı blokk, memória tömb etc...) Minden modulban az always és assign utasítások párhuzamosan értékelıdnek ki. Always blokkban nem használunk assignt! Egy always blokk egy jól meghatározott funkciót tölt be. (pl. shift regiszter, multiplexer, órajel osztó etc.) Egy always blokk egyetlen vagy néhány funkciójában szorosan kapcsolódó- reg változónak ad értréket. Minden (reg) változónak csak 1 always blokkban adjunk értéket.

Gyakorlati példák 5 dolog amibıl minden felépíthetı Edit menü > Language Templates Verilog \ Synthesis Constructs \ Coding Examples

D Flip-Flop reg ff; always @(posedge clk) if (reset) //sync. reset ff <= 1'b0; else ff<= new_value; end reg c; wire a,b; always @ (posedge clk) c <= a & b; clk a b D[0] Q[0] c

Számláló reg [3:0] count; always @(posedge clk) if (reset) count <= 0; else if (enable) count<= count + 1; reg [7:0] cntr_reg; always @ (posedge clk) if (reset) cntr_reg <= 0; else if (ce) if (load) cntr_reg <= din; else if (dir) cntr_reg <= cntr_reg 1; else cntr_reg <= cntr_reg + 1;

Multiplexer (4:1) module mux_41 (input in0, in1, in2, in3, input [1:0] sel, output reg r); always @ (*) case(sel) 2 b00: r <= in0; 2 b01: r <= in1; 2 b10: r <= in2; 2 b11: r <= in3; endcase endmodule

reg [3:0] output; wire [1:0] select; wire enable; always @( * ) if (enable) case (select) 2'b00 : output <= 4'b0001; 2'b01 : output <= 4'b0010; 2'b10 : output <= 4'b0100; 2'b11 : output <= 4'b1000; default : output <= 4'b0000; endcase else output <=0; Decoder wire [3:0] output; wire [1:0] select; wire enable; assign output = enable << (select);

Shift regiszter (párh. soros. ) reg [2:0] shift; wire out; always @(posedge clock) if (reset) shift <= 0; else if (load) shift <= load_input[2:0]; else if (shift_enable) shift <= { shift[1:0], 1 b0}; assign out = shift[2];

Ami mindig kell (De sohasem jut eszembe)

Órajel osztása (tízzel) reg [3:0] clk_div; wire tc; always @ (posedge clk) If (rst) clk_div <= 0; else if (tc) clk_div <= 0; else clk_div <= clk_div + 1; assign tc = (clk_div == 9);

Adat késleltetés és éldetektálás reg data_dly1, data_dly2; always @ (posedge clk) begin data_dly1 <= data_in; data_dly2 <= data_dly1; end wire rising, falling; assign rising = data_in &!data_dly1; (data_in==1) && (data_dly1==0) assign falling =!data_in & data_dly1; (data_in==0) && (data_dly1==1)

Háromállapotú vonalak Kétirányú kommunikációs vonalak, pl. Külsı memóriák adatbusza module tri_state (input clk, inout [7:0] data_io); wire [7:0] data_in, data_out; wire bus_drv; assign data_in = data_io; assign data_io = (bus_drv)? data_out : 8 bz; endmodule A kétirányú vonalak meghajtását engedélyezı jel (bus_drv) kritikus

Nyelvi sokszínőség

Feltétel leírása assign wire_name = (condition)? input1 : input0; always @ ( * ) - if (condition0) statement0; else if (condition1) statement1; else statement2; always @ (posedge clk) always @ ( * ) - always @ (posedge clk) case (two_bit select) 2'b00 : statement0; 2'b01 : statement1; 2'b10 : statement2; 2'b11 : statement3; default: statement_def; endcase

Példa MUX 2:1 multiplexer module mux_21 (input in0, in1, sel, output r); assign r = (sel==1 b1)? in1 : in0; endmodule module mux_21 (input in0, in1, sel, output reg r); always @ (*) if (sel==1 b1) r <= in1; else r <= in0; endmodule module mux_21 (input in0, in1, sel, output reg r); always @ (*) case(sel) 1 b0: r <= in0; 1 b1: r <= in1; endmodule Assign If Case

Példa 1 bites összeadó module add1_full (input a, b, cin, output cout, s); xor3_m xor(.i0(a),.i1(b),.i2(cin),.o(s)); wire a0, a1, a2; and2_m and0(.i0(a),.i1(b),.o(a0)); and2_m and1(.i0(a),.i1(cin),.o(a1)); and2_m and2(.i0(b),.i1(cin),.o(a2)); or3_m or(.i0(a0),.i1(a1),.i2(a2),.o(cout)) endmodule module add1_full (input a, b, cin, output cout, s); assign s = a ^ b ^ cin; assign cout = (a & b) (a & cin) (b & cin); endmodule module add1_full (input a, b, cin, output cout, s); assign {cout, s} = a + b + cin; endmodule

Állapotgépek P PS S Z

FSM Finite State Machine Állapotgép vezérlési szerkezetek kialakítása Általános struktúra State register: állapotváltozó Next state funkction: következı állapotot dekódoló logika Output function: kimeneti jeleket elıállító logika Moore: állapotváltozó alapján Mealy: állapotváltozó + bemenetek alapján

Közlekedési lámpa FSM példa Állapotok: piros, sárga, zöld, piros-sárga (a villogó sárga nem implementált) Bemeneti változók: idızítı az egyes állapotokhoz Kimenet: az állapot P PS S Z

FSM példa Verilog (1) module lampa( input clk, rst, output reg [2:0] led); parameter PIROS = 2'b00; parameter PS = 2'b01; parameter ZOLD = 2'b10; parameter SARGA = 2'b11; reg [15:0] timer_ps, timer_p, timer_s, timer_z; reg [1:0] state_reg; reg [1:0] next_state; always @ (posedge clk) if (rst) state_reg <= PIROS; else state_reg <= next_state; always @ (*) case(state_reg) PIROS: begin if (timer == 0) next_state <= PS; else next_state <= PIROS; end PS: begin if (timer == 0) next_state <= ZOLD; else next_state <= PS; end SARGA: begin if (timer == 0) next_state <= PIROS; else next_state <= SARGA; end ZOLD: begin if (timer == 0) next_state <= SARGA; else next_state <= ZOLD; end default: next_state <= 3'bxxx; endcase

FSM példa Verilog (2) always @ (posedge clk) case(state_reg) PIROS: begin if (timer == 0) timer <= 500; //next_state <= PS; else timer <= timer - 1; end PS: begin if (timer == 0) timer <= 4000; //next_state <= ZOLD; else timer <= timer - 1; end SARGA: begin if (timer == 0) timer <= 4500; //next_state <= PIROS; else timer <= timer - 1; end ZOLD: begin if (timer == 0) timer <= 500; //next_state <= SARGA; else timer <= timer - 1; end endcase Idızítı Állapotváltáskor egy állapotfüggı kezdıértéket tölt be Lefelé számol ==0: állapotváltás always @ (*) case (state_reg) PS: led <= 3'b110; PIROS: led <= 3'b100; SARGA: led <= 3'b010; ZOLD: led <= 3'b001; endcase endmodule

Szimuláció

Szimuláció Testbench: ISE két lehetıséget biztosít Testbench Waveform Grafikus felületen megadható bemenetek Verilog Test Fixture Verilog kódban megírt stimulus Szimulátor ISE szimulátor Modelsim (MXE)

Test Fixture Verilog Test Fixture A Test Fixture egy Verilog modul A tesztelendı modul almodulként van beillesztve Minden, a szintézisnél használt nyelvi elem felhasználható Nem szintetizálható nyelvi elemek Idıalap timescale 1ns/1ps Megadott idık ns-ban értendık Szimulációs lépésköz: 1 ps

initial blokk Test Fixture - initial 0. idıpillanatban kezdıdik a végrehajtása Egyszer fut le Az initial blokkok egymással, és az always blokkokkal párhuzamosan mőködnek Az initial blokkon belüli késleltetések összeadódnak, pl. initial begin a <= 0; #10 a <= 1; #25 a <= 2; #5 a <= 0; end 0 1 2 0 10 35 40

Órajel generálás initial clk <= 1; always #5 clk <= ~clk; Test Fixture - always Órajelre mőködı bemenetek (pl. számláló) initial cntr <= 0; always @ (posedge clk) #2 cntr <= cntr + 1; 0 1 2 3 4 5 6 t =2ns OH