Újrakonfigurálható áramkörök Dr. Oniga István Debreceni Egyetem, Informatikai Kar
6. Laboratóriumi gyakorlat Állapotgépek Állapotgépek felépítése Jelzőlámpa
Állapotgépek felépítése Állapotgép: vezérlési szerkezetek kialakítására használjuk Általános felépítés: Állapotregiszter (state register): állapotváltozót tárolja Következő állapot (next state) függvény: következő állapotot meghatározó logika Kimeneti (output) függvény: kimeneti jeleket előállító logika Moore: csak állapotváltozó értéke alapján Mealy: állapotváltozó és bemeneti értékek alapján
FSM példa Közlekedési lámpa Á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
Állapotregiszter module lampa ( input clk, rst, output reg [2:0] led); // állapot kódólás parameter PIROS = 2'b00; parameter PS = 2'b01; parameter ZOLD = 2'b10; parameter SARGA = 2'b11; reg [28:0] timer; reg [1:0] state_reg; reg [1:0] next_state; // allapotregiszter leirasa always @ (posedge clk) if (rst) state_reg <= PIROS; else state_reg <= next_state; // allapotvaltasok 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
Időzítés Kimeneti dekóder //idozites always @ (posedge clk) case(state_reg) PIROS: begin if (timer == 0) timer <= 200000000; else timer <= timer - 1; end PS: begin if (timer == 0) timer <= 500000000; else timer <= timer - 1; end SARGA: begin if (timer == 0) timer <= 400000000; else timer <= timer - 1; end ZOLD: begin if (timer == 0) timer <= 200000000; else timer <= timer - 1; end endcase //next_state <= PS; //next_state <= ZOLD; //next_state <= PIROS; //next_state <= SARGA; Időzítő Állapotváltáskor egy állapotfüggő kezdőértéket tölt be Lefelé számol ==0: állapotváltás // kimeneti dekoder always @ (*) case (state_reg) PS: led <= 3'b110; PIROS: led <= 3'b100; SARGA: led <= 3'b010; ZOLD: led <= 3'b001; endcase endmodule http://home.mit.bme.hu/~szanto/education/beagy_labor/verilog_pdf.pdf
Jelzőlámpa másodperc számlálóval Adjon hozzá egy ce portót a jelzőlámpa modulhoz, ez lesz majd az órajel engedélyező jel (clock enable - ce) Továbbá a ce jelet két helyen kell hozzáadni a jelzőlámpa kódjához: Az idő értékeket meg kell változtatni 500000000 -ról 5 re..
Jelzőlámpa másodperc számlálóval Írja le a Verilog top modul kódot a felső ábra alapján
Jelzőlámpás kereszteződés
Jelzőlámpa Állapotgép példa: útkereszteződés lámpája Lehetséges állapotok: piros, sárga, zöld (piros-sárga és villogó sárga nem implementált), mindkét lámpa esetén, azaz 6 lehetséges állapot Bemeneti változók: időzítők az egyes állapotokhoz Kimenet: aktuális állapot Állapot Észak-Dél Kelet-Nyugat Késleltetés (sec) 0 Zöld Piros 5 1 Sárga Piros 1 2 Piros Piros 1 3 Piros Zöld 5 4 Piros Sárga 1 5 Piros Piros 1
Jelzőlámpa Állapotgép példa: útkereszteződés lámpája 3 Hz-es órajelet használunk, amelyet a korábban megismert clkdiv modul segítségével állítunk elő Ennek megfelelően az egy másodperces várakozás esetén 3, az öt másodperces esetén 15 órajel után váltunk állapotot
Jelzőlámpa Állapotgép példa: állapotok kódolása, késleltetések, állapotváltások leírása az időzítő függvényében
Jelzőlámpa
Kimeneti dekóder Jelzőlámpa
Jelzőlámpa Hozzuk létre a top modul és az XDC fájlt Bitstream generálás után próbáljuk ki eszközön
Önálló feladat Önálló feladat 1 Implementáljuk a piros-sárga állapotot is, hogy egy valódi jelzőlámpához hasonló működést kapjunk Önálló feladat 2 Használjuk a kártyán lévő RGB LED-eket a három szín (piros, sárga, zöld színek megjelenítésére) Dokumentáció Figyeljünk a következőkre:
Önálló feladat 9.2 Tri-Color LED The Nexys A7 board contains two tri-color LEDs. Each tri-color LED has three input signals that drive the cathodes of three smaller internal LEDs: one red, one blue, and one green. Driving the signal corresponding to one of these colors high will illuminate the internal LED. The input signals are driven by the FPGA through a transistor, which inverts the signals. Therefore, to light up the tri-color LED, the corresponding signals need to be driven high. The tri-color LED will emit a color dependent on the combination of internal LEDs that are currently being illuminated. For example, if the red and blue signals are driven high, and green is driven low, the tri-color LED will emit a purple color. Note: Digilent strongly recommends the use of pulse-width modulation (PWM) when driving the tri-color LEDs (for information on PWM, see section 15.1 Pulse Density Modulation (PDM)). Driving any of the inputs to a steady logic 1 will result in the LED being illuminated at an uncomfortably bright level. You can avoid this by ensuring that none of the tri-color signals are driven with more than a 50% duty cycle. Using PWM also greatly expands the potential color palette of the tri-color led. Individually adjusting the duty cycle of each color between 50% and 0% causes the different colors to be illuminated at different intensities, allowing virtually any color to be displayed.