Teach ikasgaia
Logika digitala DE1-SoC plakan (5/6): egoera finituko makinak
Diseinatu semaforoa eta sekuentzia-detektagailua egoera finituko makinen bidez, sintetizatu eta egiaztatu DE1-SoC plakan.
Hasi saioa irakasle-kontu batekin klase-saioa prestatzeko. Ikasleak klase-kode batekin sartzen dira.
Lehen aldia duzu LabsLand-en? Sortu irakasle-kontua
Ikaskuntza-emaitzak
Egoera finituko makina egoeren, trantsizioen eta irteeren bidez azaltzea.
Moore irteerak (egoeraren araberakoak) eta Mealy irteerak (egoeraren eta sarreren araberakoak) bereiztea.
Verilog FSM baten egoera-erregistroa, hurrengo egoeraren logika eta irteeren logika irakurtzea eta moldatzea.
Semaforo-kontrolagailua eta sekuentzia-detektagailua benetako DE1-SoC plakan eraikitzea.
Detekzio laburra zergatik mantentzen den gordeta azaltzea, urruneko kameran ikusi ahal izateko.
Ikaslearen jardueraren aurrebista
Jardueraren edukia
Aurrebista soilik. Klase-saio batean, ikasleek erantzunak bete eta lana irakasleari bidal diezaiokete.
Zer da egoera finituko makina?
10 min
Gogoratzen duten zirkuituak eraiki dituzu dagoeneko: biegonkorrak bit bat gordetzen du; erregistroak, hainbat; eta kontagailuak, uneko kontua. Egoera finituko makinak (finite-state machine, FSM) memoria hori esanahia duten egoeretan antolatzen du. Une bakoitzean, makina egoera multzo mugatu bateko egoera bakarrean dago. Semaforo batean, adibidez, BERDEA, HORIA eta GORRIA izan daitezke. Egoera kopurua finitua da, eta makina beti dago horietako batean, eta bakarrean.
FSM bat hiru osagairekin deskribatzen dugu:
- Egoerak: egon daitezkeen egoeren multzo finitua. Reset-egoera berezia da: reset egitean makina egoera horretara doa.
- Trantsizioak: egoera batetik bestera pasatzeko arauak. Erlojuaren ertz aktiboan, makina uneko egoeraren eta sarreren arabera eguneratzen da.
BERDEA → HORIAtrantsizioak hau esan nahi du: «BERDEA egoeran bazaude eta baldintza betetzen bada, hurrengo ertzean HORIA egoerara pasatuko zara». - Irteerak: makinak egoera bakoitzean kontrolatzen duena; hemen, LEDak.
Egoera-erregistroa erlojuak gidatzen du: ertz aktibo bakoitzean egoera berria har dezake, uneko egoeraren eta sarreren arabera, eta egoera hori mantentzen du hurrengo ertzera arte, reset egin ezean. Biegonkorrekin ikasitako lagina hartzeko eta mantentzeko portaera bera da, egoeren sekuentzia bat egiteko erabilia. Irteera konbinazionalak, ordea, ertz artean ere alda daitezke, ondoren ikusiko duzun bezala.
Moore eta Mealy. Bi ereduen arteko aldea irteerak kalkulatzeko modua da:
- Moore makinan, irteerak uneko egoeraren araberakoak dira soilik. Egoera ezagututa, irteerak ezagutzen dituzu; sarrerak ez dira irteeraren ekuazioan agertzen. Semaforoaren oinarrizko diseinua Moore da: GORRIA egoeran, gorriaren funtzioa duen LEDa piztuta dago.
- Mealy makinan, irteerak uneko egoeraren eta uneko sarreren araberakoak dira. Egoera berean irteera desberdinak izan daitezke sarrera aldatzean. Sekuentzia-detektagailuko
detectseinalea Mealy da: egoera jakin batean aktibatzen da sarrerako bitak ere behar den balioa badu.
Moore irteerak egonkor mantentzen dira egoera berean gauden bitartean. Mealy irteerak sarrera aldatu bezain laster alda daitezke, egoera aldatu gabe. Azkar erantzuten dute, baina pultsu laburrak edo nahi gabeko iragankor laburrak (glitch) sor ditzakete; hori kontuan hartu behar da kameraz behatzean.
FSM baten ohiko egitura Verilog-en. Bi edo hiru zati bereizten ditugu:
- Egoera-erregistroa: erlojudun blokea (
always @(posedge clock ...)), uneko egoera gordetzen duena eta dagokion ertzean hurrengoa kargatzen duena. FSM-ren egoera-memoria da; diseinu osoak beste erregistro batzuk ere izan ditzake, adibidez tenporizadorea. - Hurrengo egoeraren logika: bloke konbinazionala (
always @(*)), uneko egoeratik eta sarreretatik hurrengoa kalkulatzen duena. Bide guztiek balio bat esleitu behar dute.next_statealdagaiari hasierako balioa emateak etacaseblokekodefault:adarrak hori ziurtatzen laguntzen dute; esleipenik gabeko bide batek nahi gabeko latch bat sor dezake. - Irteeren logika:
assignesleipenak edo bloke konbinazionalaren zati bat; egoeratik kalkulatzen ditu irteerak (Moore), edo egoeratik eta sarreretatik (Mealy).
Bi diseinuetan bereizketa hori ikusiko duzu: erlojudun egoera-erregistroa, always @(*) bidezko hurrengo egoeraren kalkulua eta irteeren logika.
Salmenta-makina batek sartutako dirua gogoratzen du eta produktua ematen du preziora iristean. FSM bidez modelatuz gero, zerk adierazten du hobekien egoera?
Zirkuituak LED bat pizten du BUSY egoeran dagoenean eta une horretan go sarrera 1 denean. Irteera hori Moore ala Mealy da? Azaldu esaldi batean.
Nahitaezko oharra: FSM hauen reset asinkronoa
7 min
Eraikitzen hasi aurretik, alderatu bi reset motak.
Hirugarren ikasgaiko biegonkorrek eta erregistroek reset sinkronoa zuten: resetaren baldintza erlojudun blokearen barruan egiaztatzen zen, adibidez if (!KEY[0]) Q <= 0;, always @(posedge CLOCK_50) barruan. Baldintza erloju-ertzean bakarrik ebaluatzen denez, reset sinkronoak hurrengo goranzko ertzean eragiten du. Erlojua motela bada, itxaron egin behar da.
Ikasgai honetako FSMek maila baxuan aktibo den reset asinkronoa dute; 4. ikasgaiko kontagailuaren eta desplazamendu-erregistroaren antzera. Begiratu egoera-erregistroaren sentikortasun-zerrenda:
always @(posedge slow_clk or negedge KEY[0]) begin
if (!KEY[0]) state <= TODO_RESET_STATE; // asinkronoa: KEY[0] jaisten denean eragiten du
else state <= TODO_NEXT_STATE;
end
or negedge KEY[0] gehitzeak esan nahi du blokea KEY[0] jaisten denean ere aktibatzen dela —sakagailua sakatzean—, slow_clk seinalearen ertza itxaron gabe. Horrela, KEY[0] sakatzeak egoera ezaguna ezartzen du berehala, erloju motelarekiko itxaronaldirik gabe.
- Reset sinkronoa: erlojuaren ertz aktiboan eragiten du. Erloju motelarekin, hurrengo ertzera arte itxaron behar da, eta resetak aktibo jarraitu behar du une horretan.
- Reset asinkronoa: aktibatu bezain laster eragiten du, erlojuaren ertzik itxaron gabe.
Zergatik erabili hemen? KEY[0] sakatzean, zatitzaileak slow_clk = 0 mantentzen du. Beraz, egoera-erregistroan reset sinkronoa soilik utziz gero, ez litzateke goranzko ertzik iritsiko reset aktibo dagoen bitartean; askatzean, berriz, reset-baldintza ez litzateke beteko. Reset asinkronoak hasierako egoera ezartzen du erlojua geldirik egonda ere. KEY maila baxuan aktibo da: negedge KEY[0] sakatzearen unea da, eta !KEY[0] egia da sakatuta mantentzen den bitartean.
Bi reset motak alderatzeko, demagun erlojuak martxan jarraitzen duela KEY[0] sakatuta ere. Hurrengo goranzko ertzerako ia segundo bat falta dela sakatzen duzu, eta sakatuta mantentzen duzu. Noiz eragingo luke reset asinkronoak, eta noiz reset sinkronoak? Erantzun hipotesi horretan oinarrituta; ondoko galderan aztertuko duzu benetako zatitzailearen portaera.
Egoera-erregistroak always @(posedge slow_clk or negedge KEY[0]) erabiltzen du. Zer gehitzen du or negedge KEY[0] zatiak? Nola eragingo luke resetak zati hori kenduta, always @(posedge slow_clk) soilik utziz?
3-A ariketa: semaforoa (Moore FSM)
10 min
Lehen FSM semaforo-kontrolagailua da. Hiru egoera ditu, ziklo finko batean; argi bakoitza erloju-urrats kopuru jakin batez mantentzen du:
BERDEA → HORIA → GORRIA → BERDEA → ...
Konexioak: LEDR[0] = berdearen funtzioa; LEDR[1] = horiaren funtzioa; LEDR[2] = gorriaren funtzioa. Plakako LEDR LEDak gorriak dira fisikoki: izenek semaforoaren funtzioak adierazten dituzte. KEY[0] resetak (maila baxuan aktibo) GREEN egoera ezartzen du. FSMak slow_clk zatitua erabiltzen du. Urrats bakoitza haren goranzko ertz bat da: zatitzaile honekin, ondoz ondoko goranzko ertzen arteko tartea 0,67 s ingurukoa da.
Moore makina da. Amaierako irteera-logika hau da:
assign LEDR[0] = TODO_GREEN_LED_EXPRESSION;
assign LEDR[1] = TODO_YELLOW_LED_EXPRESSION;
assign LEDR[2] = TODO_RED_LED_EXPRESSION;
LED bakoitza egoeraren araberakoa da soilik: adierazpenetan ez dago sarrerarik. Egoera ezagututa, zein LED dagoen piztuta badakizu. Hori da Moore makinaren ezaugarria.
Bi erregistro, bi eginkizun. Erlojudun blokeak bi memoria eguneratzen ditu:
stateerregistroak (reg [1:0]) zein argi dagokion uneko egoerari gordetzen du: GREEN, YELLOW edo RED.timererregistroak (reg [2:0]) iraute-denbora kontrolatzen du. Zero baino handiagoa den bitartean, urrats bakoitzean unitate bat kentzen zaio (timer <= timer - 1), eta egoera ez da aldatzen.timeraurretik0den ertzean, makinaknext_statekargatzen du eta tenporizadorea egoera berrirako birkargatzen du.
Beraz, state erregistroak zein argi gordetzen du; timer erregistroak, zenbat iraun. Bigarrenari esker, argi bakoitzak hainbat urrats irauten du.
Kodearen denborak. Egoera batean sartzean, timer kargatzen da. Kargatutako baliotik 0 arte, biak barne, zenbatzeak urrats kopurua ematen du:
- GREEN:
timer = 3;3, 2, 1, 0→ 4 urrats, gutxi gorabehera 2,67 s. - YELLOW:
timer = 1;1, 0→ 2 urrats, gutxi gorabehera 1,33 s. - RED:
timer = 3→ 4 urrats, gutxi gorabehera 2,67 s.
Ziklo osoa 4 + 2 + 4 = 10 urratsekoa da: 6,67 s inguru. Kontuz: DIV = 16_666_666 izanik, slow_clk 0,33 s ingurutik behin alderantzikatzen da, baina goranzko ertzetik hurrengora bi aldaketa behar dira. Reset askatu ondorengo lehen ertza 0,33 s ingurura dator; beraz, denborak neurtzeko, utzi lehen zikloa igarotzen.
GREEN → YELLOW → RED → GREEN. Tenporizadoreak egoerak 4, 2 eta 4 urratsez mantentzen ditu, hurrenez hurren; urrats bat 0,67 s inguru da. Egoera bakoitzak LED bakarra pizten du. KEY[0] resetak GREEN ezartzen du.
Hasierako moduluan, zatitzaileak slow_clk sortzen du; reset asinkronoa duen erlojudun blokeak egoera eguneratzen du tenporizadorea amaitzean; always @(*) blokeak hurrengo egoera kalkulatzen du; eta assign lerroek Moore irteerak ematen dituzte. Osatu TODO_* markatzaileak sintetizatu aurretik.
// 5. ikasgaia - 3-A ariketa: semaforoaren txantiloia (Moore FSM)
// Osatu hurrengo egoera eta irteerak sintetizatu aurretik.
module leds_mirror(CLOCK_50, KEY, LEDR);
input CLOCK_50;
input [3:0] KEY;
output [9:0] LEDR;
localparam GREEN = 2'd0, YELLOW = 2'd1, RED = 2'd2;
localparam [24:0] DIV = 25'd16_666_666;
reg [24:0] div;
reg slow_clk;
always @(posedge CLOCK_50) begin
if (!KEY[0]) begin div <= 0; slow_clk <= 0; end
else if (div == DIV) begin div <= 0; slow_clk <= ~slow_clk; end
else div <= div + 1'b1;
end
reg [1:0] state, next_state;
reg [2:0] timer;
always @(posedge slow_clk or negedge KEY[0]) begin
if (!KEY[0]) begin state <= GREEN; timer <= 3'd3; end
else if (timer == 3'd0) begin
state <= next_state;
case (next_state)
GREEN: timer <= 3'd3;
YELLOW: timer <= 3'd1;
RED: timer <= 3'd3;
default: timer <= 3'd3;
endcase
end else timer <= timer - 1'b1;
end
always @(*) begin
case (state)
GREEN: next_state = TODO_AFTER_GREEN;
YELLOW: next_state = TODO_AFTER_YELLOW;
RED: next_state = TODO_AFTER_RED;
default: next_state = GREEN;
endcase
end
assign LEDR[0] = TODO_GREEN_LED_EXPRESSION;
assign LEDR[1] = TODO_YELLOW_LED_EXPRESSION;
assign LEDR[2] = TODO_RED_LED_EXPRESSION;
assign LEDR[9:3] = 7'b0;
endmoduleBegiratu semaforoko LEDen hiru irteera-markatzaileak. Irteeretako bat Moore izan beharrean Mealy bihurtzeko, sarreraren araberako zer motatako baldintza gehitu beharko zenioke?
3-A ariketa plakan: behatu, aldatu eta zabaldu
14 min
Eraiki semaforoa benetako DE1-SoC plakan, neurtu faseak eta moldatu diseinua.
Ireki DE1-SoC plakaren Verilog laborategia. Editorean
leds_mirror.vagertzen da.Ordeztu fitxategiko eduki guztia osatu duzun semaforo-moduluarekin. Mantendu
leds_mirrorizena etainput CLOCK_50;deklarazioa.Sakatu Sintetizatu. Gida batek botoia estaltzen badu, itxi edo saltatu gida. Itxaron amaitu arte (1–3 min inguru). Ohiko akatsak dira
CLOCK_50ataka-zerrendan ez sartzea edo puntu eta koma ahaztea. Zuzendu eta sintetizatu berriz. Jarraitu amaierako emaitzak 0 errore dituenean.Sakatu FPGAra igo eta itxaron plaka eta kamera prest egon arte. Sakatu eta askatu
KEY[0], hasierako egoera ezartzeko.Behatu zikloa. Ikusi nola txandakatzen diren
LEDR[0](berdea),LEDR[1](horia) etaLEDR[2](gorria). Lehen zikloa igarota, neurtu fase bakoitzaren iraupena segundotan edo urratsetan, eta jaso taulan. Alderatu kodearekin: GREEN 4 urrats, YELLOW 2 eta RED 4.Egin reset. YELLOW edo RED aktibo dagoenean, sakatu eta askatu
KEY[0]. Makinak GREEN egoerara itzuli behar du erloju-ertzaren zain egon gabe. Kameran, aldaketa hurrengo irudia iristean ikusiko duzu.
Klase-saio batean erabilgarri
Behatu kamerako zikloa, resetaren ondorengo lehen zikloa igarotzen utzita. Jaso fase bakoitzaren iraupena segundotan edo urratsetan (urrats bakoitza 0,67 s inguru da). Alderatu kodeko urratsekin: GREEN 4, YELLOW 2, RED 4.
| Fasea (piztutako LEDa) | Espero diren urratsak (kodea) | Behatutako iraupena (s edo urratsak) |
|---|---|---|
Jaso zure ebidentzia. Hartu kameraren irudi bat YELLOW fasean: LEDR[1] piztuta eta LEDR[0] zein LEDR[2] itzalita. Gehitu irudiaren erreferentzia edo esteka.
Egin orain bi aldaketa.
Aldatu iraute-denborak. Moldatu timer birkargatzeko balioak, zikloa GREEN = 6 urrats, YELLOW = 2 urrats, RED = 6 urrats izan dadin. Tenporizadoreak 0 ere zenbatzen duenez, N urratsetarako N − 1 kargatu behar duzu: 5 GREEN-erako, 1 YELLOW-erako eta 5 RED-erako. Aldatu erlojudun blokeko case adarrak eta reset-lerroko GREEN hasierako balioa ere. Sintetizatu, kargatu eta egiaztatu denbora berriak kameran. Kalkulatu ziklo osoaren urrats kopurua.
Gehitu gorri keinukariaren egoera. Gehitu FLASH_RED laugarren egoera, RED ondoren: GREEN → YELLOW → RED → FLASH_RED → GREEN. FLASH_RED egoeran, gorriaren LEDak keinu egin behar du hainbat urratsetan —adibidez, 4—, GREEN-era itzuli aurretik. Pista: oraingo state/next_state erregistroen 2 bitak nahikoak dira lau egoeretarako. Gehitu FLASH_RED localparam zerrendan, hurrengo egoeraren case blokean eta tenporizadorearen iraupenetan. Egoera horretan, kontrolatu LEDR[2] urratsez urrats aldatzen den bit batekin —adibidez, timer erregistroaren beheko bitarekin—, beti 1 utzi beharrean. Sintetizatu, kargatu eta behatu keinuak GREEN-era itzuli aurretik.
YELLOW faseak bi aldiz gehiago iraun dezan, zer aldatuko zenuke: state ala timer? Zein balio eta kodeko zein tokitan? Zein erregistro utziko zenuke aldatu gabe?
GREEN = 6, YELLOW = 2 eta RED = 6 urratseko bertsioan, zenbat urrats irauten du ziklo osoak, FLASH_RED gehitu aurretik? Erakutsi batura.
Erabili kodea eta behaketak jatorrizko hiru egoerako semaforoa Moore makina dela bi edo hiru esalditan justifikatzeko. Identifikatu irteera-logika eta azaldu zergatik diren LEDak state egoeraren araberakoak soilik, sarreren menpe egon gabe.
3-B ariketa: 1011 sekuentziaren detektagailua (Mealy FSM)
11 min
Bigarren FSMak SW[0] sarreratik urratseko bit bat jasotzen du, eta LED bat pizten du 1011 patroia detektatzean. Bere detect irteera Mealy da: egoera jakin batean aktibatzen da sarrerako bita ere zuzena denean. Beraz, egoeraren eta sarreraren araberakoa da.
Konexioak: SW[0] = serieko sarrerako bita; KEY[0] = reset (maila baxuan aktibo); LEDR[0] = detekzioa gordeta; eta LEDR[4:1] = egoeraren adierazpena, arazteko. S0–S3 egoeretan LED bakarra pizten da (one-hot); S4 egoeran lauak itzalita daude. slow_clk zatitzaileak 1,33 s inguru uzten ditu goranzko ertzen artean; erabili DIV = 33_333_333 balioa.
Egoerak. Detektagailuak 1011 patroiaren zer zati ikusi duen gogoratzen du:
S0: oraingoz ez dago bat datorren zatirik; reset-egoera da.S1: azken bita1izan da;1aurrizkia bat dator.S2:10bat dator.S3:101bat dator.S4:1011osoa detektatu da. Ondorengo trantsizioek bilaketa jarraitzen dute.
Hurrengo egoeraren blokeak uneko egoera eta SW[0] bita erabiltzen ditu. detect S3 egoeran eta sarrera 1 denean aktibatzen da: 101 ondoren 1 jasotzeak 1011 osatzen du. Hori da Mealy irteera.
Zergatik mantendu detekzioa gordeta? detect seinale konbinazionala laburra izan daiteke: sarrera aldatzean aktiba daiteke eta egoera edo sarrera berriz aldatzean desaktibatu. Ez du beti urrats oso bat irauten. Erloju azkar batekin kamerak ez luke bereiziko; motelean ere erraz gal daiteke. Horregatik, diseinuak ez du detect zuzenean LEDera konektatzen. detected_latch erregistroak 1 gordetzen du goranzko ertzean detect = 1 irakurtzen badu, eta reset egin arte 1 mantentzen du. LEDR[0] erregistro horren irteera da. Izenak latch badio ere, hemen erloju-ertzak gidatutako biegonkorra da. Gertaera laburra behatzeko moduko adierazle iraunkor bihurtzen du.
detect S3 egoeraren eta 1 sarreraren araberakoa da. S3 egoeran 0 sartzean S2ra itzultzeak bat datorren 10 amaiera gordetzen du, eta 101011 sekuentzian berreskuratzeko aukera ematen du. Irudian ageri den S4 → S0 trantsizioak, ordea, esan nahi du diseinu honek ez dituela gainjarritako sekuentzia guztiak detektatzen; adibidez, 1011011 sekuentziaren bigarren detekzioa galtzen du. Ertzean gordetako detekzioak LEDR[0] piztuta mantentzen du reset egin arte.
Hasierako moduluan, always @(*) bloke konbinazionalak next_state eta Mealy detect irteera kalkulatzen ditu. always @(posedge slow_clk or negedge KEY[0]) blokeak egoera eta detekzio-adierazlea gordetzen ditu, reset asinkronoarekin. Osatu TODO_* markatzaileak sintetizatu aurretik.
// 5. ikasgaia - 3-B ariketa: 1011 detektagailuaren txantiloia (Mealy FSM)
// Osatu trantsizioak, Mealy detekzio-seinalea eta egoeraren adierazpena.
module leds_mirror(CLOCK_50, KEY, SW, LEDR);
input CLOCK_50;
input [3:0] KEY;
input [9:0] SW;
output [9:0] LEDR;
localparam [26:0] DIV = TODO_DIVIDER_LIMIT;
reg [26:0] div;
reg slow_clk;
always @(posedge CLOCK_50) begin
if (!KEY[0]) begin div <= 0; slow_clk <= 0; end
else if (div == DIV) begin div <= 0; slow_clk <= ~slow_clk; end
else div <= div + 1'b1;
end
localparam S0=3'd0, S1=3'd1, S2=3'd2, S3=3'd3, S4=3'd4;
reg [2:0] state, next_state;
reg detect;
always @(*) begin
next_state = TODO_DEFAULT_NEXT_STATE;
detect = 1'b0;
case (state)
S0: TODO_TRANSITION_FROM_S0;
S1: TODO_TRANSITION_FROM_S1;
S2: TODO_TRANSITION_FROM_S2;
S3: begin
TODO_TRANSITION_AND_DETECT_FROM_S3;
end
S4: TODO_TRANSITION_FROM_S4;
default: next_state = TODO_DEFAULT_STATE;
endcase
end
reg detected_latch;
always @(posedge slow_clk or negedge KEY[0]) begin
if (!KEY[0]) begin state <= TODO_RESET_STATE; detected_latch <= 1'b0; end
else begin
state <= next_state;
if (detect) detected_latch <= 1'b1;
end
end
assign LEDR[0] = detected_latch;
assign LEDR[4:1] = TODO_ONE_HOT_STATE_DISPLAY;
assign LEDR[9:5] = 5'b0;
endmoduledetect noiz aktibatuko den zehaztu al dezakezu LEDR[4:1] egoera-LEDak bakarrik ikusita, SW[0] ezagutu gabe? Erabili erantzuna irteera Mealy dela, eta ez Moore, azaltzeko.
3-B ariketa plakan: bitak sartu, berreskuratu eta moldatu
14 min
Eraiki detektagailua eta sartu bitak eskuz. Bit bat sartzeko, ezarri SW[0] dagokion balioan eta mantendu hurrengo slow_clk goranzko ertzean lagina hartu arte. Ondoz ondoko ertzen tartea 1,33 s ingurukoa da. Jarraitu egoera LEDR[4:1] bidez, eta aldatu hurrengo bita aurrekoa hartu ondoren. Eskuzko denborak eta kameraren atzerapenak ez dira zehatzak: taulako egoerak espero dituzunekin bat ez badatoz, egin reset eta errepikatu, bit bakoitza ertz bakarrean hartzea helburu. Resetaren ondorengo lehen ertza 0,67 s ingurura dator; prestatu lehen bita reset askatu aurretik.
Ordeztu
leds_mirror.vedukia osatu duzun1011detektagailuarekin. Mantenduleds_mirrorizena etainput CLOCK_50;deklarazioa.Sakatu Sintetizatu, itxaron errore gabe amaitu arte eta sakatu FPGAra igo.
Egin reset hasteko. Sakatu
KEY[0]:LEDR[0]itzalita egon behar da etaLEDR[4:1]irteerak S0 (0001) adierazi behar du. Prestatu lehen bita eta askatu reset.Sartu
1, 0, 1, 1. JarriSW[0] = 1lehen ertzerako; ondoren0hurrengorako; eta1hurrengo bi ertzetarako. Jaso egoera bit bakoitza hartu ondoren. Azken1hartu ondoren,LEDR[0]piztuta geratu behar da.Egin reset, eta sartu
1, 0, 1, 0, 1, 1, tartean espero ez zen bit bat duena. Bit okerrak ez du detekzio faltsurik sortu behar. Makinak bat datorren zatia mantendu eta amaierako1011detektatu behar du;LEDR[0]piztuta geratuko da.Egin reset sekuentzia berri bat hutsetik probatu nahi duzunean. Diseinu honetan resetak bakarrik itzaltzen du gordetako
LEDR[0]adierazlea.
Klase-saio batean erabilgarri
Sartu 1,0,1,1 sekuentzia, bit bat slow_clk-ren goranzko ertz bakoitzean (ertzen artean 1,33 s inguru). Jaso LEDR[4:1] egoera eta LEDR[0] piztuta geratu den. Egoera-kodeak: 0001=S0, 0010=S1, 0100=S2, 1000=S3, 0000=S4. S4 egoeran ez dago piztutako egoera-LEDrik. Detekzio-adierazlea azken 1 hartu ondoren geratzen da piztuta.
| Sartutako bita (SW[0]) | Behatutako LEDR[4:1] | LEDR[0]: piztuta / itzalita |
|---|---|---|
Jaso zure ebidentzia. 1, 0, 1, 1 sartu ondoren, LEDR[0] piztuta mantentzen da reset egin arte. Hartu hori erakusten duen kameraren irudi bat eta gehitu haren erreferentzia edo esteka.
Moldatu orain detektagailua.
Detektatu 101, 1011 ordez. Marraztu lehenik egoera-diagrama berria paperean: «ez dago bat datorren zatirik», «1 bat dator» eta «10 bat dator» egoerak behar dituzu. detect aktibatu behar da «10 bat dator» egoeran sarrerako bita 1 denean. Kontuan hartu gainjartzea: 101 detektatu ondorengo azken 1 hurrengo 101 sekuentziaren hasiera izan daiteke. Ondoren, moldatu Verilog kodea: kendu beharrezkoak ez diren egoerak —S4, adibidez—, zuzendu trantsizioak eta aktibatu detect dagokion baldintzan. Mantendu gordetako detekzio-adierazlea eta egokitu egoera-LEDak geratzen diren egoeretara. Sintetizatu, kargatu eta egiaztatu 1, 0, 1 sartzeak LEDR[0] piztuta uzten duela.
Jatorrizko detect Mealy seinalea erregistratua da —biegonkor batean gordea—, ala konbinazionala —egoeratik eta sarreratik zuzenean kalkulatua—? Zer denborazko arazo sor dezake irteera konbinazionalak? Nola laguntzen du LEDR[0] adierazlea erregistroan gordeta mantentzeak?
detect pultsu laburra zuzenean LEDR[0] irteerara konektatuko bazenu, gordeta mantendu ordez, zer ikus zenezake kameran 1011 detektatzean? Zergatik litzateke zaila irudia une egokian hartzea, erloju motelaren ertzen arteko tartea 1,33 s ingurukoa izan arren?
Bosgarren urratsean 1, 0, 1, 0, 1, 1 sartu duzu, eta makinak amaierako 1011 detektatu du. Azaldu labur nola berreskuratu den espero ez zen bitaren ondoren, blokeatu edo detekzio faltsua eman gabe.
Zer eraiki duzu?
4 min
Bi egoera finituko makina eraiki dituzu benetako DE1-SoC plakan: Moore semaforoa, egoeraren araberako irteerekin eta GREEN → YELLOW → RED zikloa gidatzen duen tenporizadorearekin; eta Mealy 1011 detektagailua, egoeraren eta sarreraren araberako detect irteerarekin. FSM-ren ohiko zatiak erabili dituzu: erlojudun egoera-erregistroa, hurrengo egoeraren logika konbinazionala eta irteeren logika. Maila baxuan aktibo den reset asinkronoak egoera ezaguna ezartzen du erloju-ertzik itxaron gabe. Detekzio laburra gordeta mantentzeak kameraren bidez ebidentzia jasotzen laguntzen du.
Zein sekuentziak adierazten du ikasgai honetako ariketetan egin duzuna?
Azaldu lau edo bost esalditan zergatik den semaforoa Moore eta detektagailuaren detect irteera Mealy, bakoitzaren irteera-logika aipatuz. Bereizi semaforoko state eta timer erregistroen eginkizunak; azaldu zergatik mantentzen den detektagailuko LEDR[0] piztuta; eta aipatu noiz izan den garrantzitsua KEY maila baxuan aktibo izatea edo reset asinkronoa erabiltzea.
Bihurtu aurrebista hau klase-saio batean
Jarraitu LabsLand Teach-era ikasgai hau ikasleekin erabiltzeko eta kontuaren sarbidea berrikusteko.
Lehen aldia duzu LabsLand-en? Sortu irakasle-kontua