Teach ikasgaia
Logika digitala DE1-SoC plakan (3/6): memoria, D biegonkorrak eta erregistroak
D biegonkorrak eta erregistroak eraikiko dituzu Verilogen, erlojuaren eta reset seinalearen eragina probatuko duzu, eta logika konbinazionala gordetako egoeratik bereiziko duzu.
Hasi saioa irakasle-kontu batekin klase-saioa prestatzeko. Ikasleak klase-kode batekin sartzen dira.
Lehen aldia duzu LabsLand-en? Sortu irakasle-kontua
Ikaskuntza-emaitzak
Logika sekuentzialak memoria zergatik behar duen eta konbinazionalak zergatik ez duen behar azaltzea.
D biegonkorrak erlojuaren ertzean datua nola hartzen eta mantentzen duen azaltzea, reset sinkronoa kontuan hartuta.
Erloju eta reset bera duten D biegonkorrekin 8 biteko karga paraleloko erregistroa eraikitzea.
Erlojudun blokeetan esleipen ez-blokeatzaileak erabiltzea eta KEY sarrerak maila baxuan aktibatzen direla ezagutzea.
Ikaslearen jardueraren aurrebista
Jardueraren edukia
Aurrebista soilik. Klase-saio batean, ikasleek erantzunak bete eta lana irakasleari bidal diezaiokete.
Zergatik behar dute memoria zirkuituek?
10 min
Orain arte, zure diseinu guztiak konbinazionalak izan dira: LEDen balioa etengailuen une horretako posizioen araberakoa zen soilik. Etengailu bat aldatzean, irteera aldatzen da seinaleak ateak zeharkatu bezain laster. Zirkuitu konbinazional batek ez du egoera gordetzen: ez daki zer sarrera zeuden une bat lehenago, eta ez du ezer gogoratzen.
Sistema askok, ordea, memoria behar dute. Kontagailuak uneko balioa jakin behar du hurrengoa sortzeko. CPU batek eragigaiak eta emaitzak gorde behar ditu instrukzioen artean. Semaforo batek une horretan zer kolore erakusten duen jakin behar du hurrengoa erabakitzeko. Sare konbinazional huts batek ezin du hori egin, uneko sarreren arabera bakarrik jokatzen duelako.
Logika sekuentzialak gogoratu egiten du. Irteera uneko sarreren eta gordetako egoeraren araberakoa da; egoerak aurretik gertatutakoa jasotzen du. Egoera-bit bat gordetzen duen oinarrizko elementua biegonkorra da (flip-flop). Erlojuak zehazten du biegonkor bakoitza noiz eguneratzen den.
DE1-SoC plakak etengabe dabilen 50 MHz-eko CLOCK_50 erlojua eskaintzen du: segundoko 50.000.000 ziklo egiten dituen uhin karratua. Ikasgai honetatik aurrera, ikastaroko diseinu sekuentzialek sarrera gisa deklaratu behar dute. leds_mirror.v hasierako txantiloiak ez du erlojurik deklaratzen; gehitu input CLOCK_50; eta sartu CLOCK_50 moduluaren portu-zerrendan. Hori ahaztea ohiko errorea da diseinu sekuentzialetan.
Zirkuitu hauetatik zein da sekuentziala, hau da, haren irteera iraganaren araberakoa izan daiteke, eta ez da soilik konbinazionala?
1.–2. ikasgaietako diseinu konbinazionalek ez zuten erlojurik deklaratzen. Biegonkorra bezalako diseinu erlojudunak, berriz, input CLOCK_50; ere behar du. Zergatik behar du erlojua biegonkor edo erregistro batek? Zer arazo sortu ohi da erlojua deklaratu gabe uzten baduzu? Erantzun esaldi batean edo bitan.
D biegonkorra: datua hartu eta mantendu erlojuaren ertzean
11 min
D biegonkorra oinarrizko memoria-elementu bat da. D datu-sarrera, erloju-sarrera eta Q irteera ditu. Honako arau honi jarraitzen dio:
Erlojuaren goranzko ertz bakoitzean,Q-kD-ren balioa hartzen du eta hurrengo goranzko ertzera arte mantentzen du.
Ertzen artean, D aldatzeak ez du Q aldatzen: Q bere horretan geratzen da. Biegonkorrak lagina hartu eta balioa mantentzen du: erlojua 0-tik 1-era igarotzen den unean D lagintzen du, eta gero lagin hori gordetzen du. Horrela lortzen da memoria: D berriz 0 izan arren, Q-k 1 izaten jarrai dezake hurrengo ertzera arte, hartutako lagina gogoratzen duelako.
Q erlojuaren goranzko ertz bakoitzean bakarrik eguneratzen da, une horretan D-k duen balioa hartuta. Balio hori hurrengo ertzera arte mantentzen du; ertzen arteko D aldaketek ez diote eragiten. Diagrama kontzeptuala da; ez da zuzeneko kameran ikus daitekeen 50 MHz-eko seinalea.
Nola idatzi Verilogen: bi ideia berri.
Lehenengoa erlojudun blokea da. Ertzean aktibatzen den portaera always @(posedge CLOCK_50) bidez deskribatzen da: barruko instrukzioak goranzko ertz bakoitzean ebaluatzen dira, ez etengabe. Bloke horretan esleitutako seinalea reg gisa deklaratzen da. Ertzen artean balioa gordetzea bloke honen portaeraren ondorio da; reg deklarazioak bakarrik ez du memoria definitzen.
Bigarrena <= esleipen ez-blokeatzailea da. Erlojudun blokeetan, erabili <=. Eskuineko balioak ebaluatu egiten dira, eta ezkerreko seinaleen eguneraketak gero batera aplikatzeko programatzen dira. Horrela, biegonkorrek ertzean dituzten balio zaharrekin egiten da kalkulua. = esleipen blokeatzaileak berehala eguneratzen du ezkerreko aldagaia; ondorengo esleipen batek balio berria erabil dezake, zaharra erabili ordez. Horrek nahi zenuen portaera alda dezake hainbat erregistro kateatzean. Ikastaroko arau praktikoa: <= erlojudun blokeetan; = esleipen jarraituetan (assign) edo always @(*) bloke konbinazionaletan.
Reset sinkronoa. Q balio ezagun batera berrezartzeko kontrola ere behar dugu: reset seinalea. Reset sinkronoa erlojudun blokearen barruan egiaztatzen da; beraz, erlojuaren ertzean bakarrik eragiten du:
always @(posedge CLOCK_50) begin
if (!KEY[0]) Q <= TODO_RESET_VALUE; // Reset sinkronoa, erlojuaren ertzean ebaluatua
else Q <= TODO_CAPTURED_VALUE;
end
KEY maila baxuan aktibatzen denez, sakatuta dagoenean 0 irakurtzen da. Horregatik, !KEY[0] egia da reset sakagailua sakatuta mantentzen den bitartean.
Demagun always @(posedge CLOCK_50) blokearen barruan Q = SW[0]; idatzi duzula = blokeatzailearekin, <= erabili ordez. Zer eragile erabili beharko zenuke? Zer arazo sor daiteke bloke bereko hainbat biegonkor = bidez eguneratzean?
Demagun aurreko goranzko ertzean Q=0 geratu dela. D une batez 1-era igotzen da hurrengo goranzko ertza baino lehen, baina berriz 0-ra itzultzen da ertz hori iritsi aurretik. Q inoiz 1 izango al da tarte horretan edo hurrengo ertzean? Azaldu lagina hartu eta mantentzeko araua erabiliz.
2-A ariketa: D biegonkorra, reset ikusgarriarekin
12 min
Eraiki D biegonkor bat benetako plakan. Konexioak: SW[0] = D, KEY[0] = reset (maila baxuan aktiboa), LEDR[0] = Q, eta LEDR[1] = ~Q.
Irakurri hau probatu aurretik. 50 MHz-etan, Q-k D segundoko 50.000.000 aldiz lagintzen du, begiek edo kamerak bereiz dezaketena baino askoz azkarrago. Zirkuituak D gordetzen badu ere, ezin izango duzu gordetze hori ikusi: SW[0] mugitzean, LEDR[0]-k berehala erantzuten duela dirudi. Ariketa honetan batez ere resetaren eragina ikusiko duzu. Hauek dira behaketak:
SW[0]goian dagoela (D=1),LEDR[0]piztuta dago, eta~Qerakusten duenLEDR[1], itzalita.KEY[0]sakatuta mantentzen baduzu (0irakurtzen da, eta reseta aktibo dago),LEDR[0]itzali egiten da, nahiz etaSW[0]goian egon. Resetak lehentasuna du datuaren aurrean.KEY[0]askatzean,LEDR[0]berrizSW[0]-ren araberakoa da.
Memoria hurrengo ariketan (2-B) ikusiko duzu argi. Hemen, egiaztatu resetak datu-sarreraren gainetik lehentasuna duela.
// 3. ikasgaia - 2-A ariketa: D biegonkorraren txantiloia
// SW[0]=D, KEY[0]=reset (maila baxuan aktiboa), LEDR[0]=Q, LEDR[1]=~Q.
module leds_mirror(CLOCK_50, SW, KEY, LEDR);
input CLOCK_50;
input [9:0] SW;
input [3:0] KEY;
output [9:0] LEDR;
reg Q;
always @(posedge CLOCK_50) begin
if (!KEY[0]) Q <= TODO_RESET_VALUE;
else Q <= TODO_D_INPUT;
end
assign LEDR[0] = TODO_Q_OUTPUT;
assign LEDR[1] = TODO_NOT_Q_OUTPUT;
assign LEDR[9:2] = 8'b0;
endmoduleIreki DE1-SoC Verilog laborategia. Editoreak
leds_mirror.verakusten du.Ordeztu
leds_mirror.vfitxategiaren eduki osoa goiko D biegonkorraren moduluarekin. Mantenduleds_mirrorizena eta osatu TODO adierazpenak. Kontuan hartuinput CLOCK_50;deklarazioa: ikastaroko diseinu erlojudunek sarrera hori behar dute, baita moduluaren portu-zerrendan ere.Sakatu Sintetizatu. Gida batek botoia estaltzen badu, itxi edo saltatu lehenik. Itxaron amaitu arte (1–3 minutu inguru). Errorea badago, begiratu
CLOCK_50portu-zerrendan sartu duzun edo puntu eta komarik falta den. Zuzendu eta sintetizatu berriro. Jarraitu soilik azken egoerak 0 errore adierazten dituenean.Sakatu FPGAra igo, eta itxaron plaka eta kamera agertu arte.
Jarri
SW[0]goian (D=1). EgiaztatuLEDR[0](Q) piztuta dagoela etaLEDR[1](~Q), itzalita.Egiaztatu reseta:
SW[0]goian mantenduta, sakatu eta eutsiKEY[0]-ri. BehatuLEDR[0]itzali egiten dela etengailua aldatu gabe: resetak datuaren gainetik lehentasuna du. AskatuKEY[0], eta egiaztatuLEDR[0]berriz pizten dela.
Klase-saio batean erabilgarri
Jarri SW[0] eta KEY[0] errenkadak adierazten duen egoeran, eta jaso kameran LEDR[0] (Q) eta LEDR[1] (~Q) seinaleek erakusten dutena (1 = piztuta, 0 = itzalita). Gogoratu KEY maila baxuan aktibatzen dela: sakatuta = 0, askatuta = 1.
| SW[0] (D) | KEY[0] (0=sakatuta, 1=askatuta) | LEDR[0] = Q | LEDR[1] = ~Q |
|---|---|---|---|
Zer alde dago biegonkor honen eta SW[0]-tik LEDR[0]-ra doan hari soil baten artean? Erantzun memoria kontuan hartuta.
Diseinu honek reset sinkronoa erabiltzen du. Seinalatu kodean reseta egiten duen lerroa, eta azaldu zer esan nahi duen «sinkronoa» izateak resetak noiz eragiten duen kontuan hartuta. 4. ikasgaitik aurrera reset asinkronoa ere ikusiko duzu.
Zergatik erakusten du LEDR[1]-ek beti LEDR[0]-ren aurkako balioa?
2-A ariketak D gordetzen du, baina kameran resetaren eragina ikusi ahal izan duzu, ez gordetze-prozesua. Erabili 50 MHz-eko maiztasuna azaltzeko zergatik ezin den gordetzea bereizi eta zergatik ikus daitekeen argi sakatuta mantendutako reseta.
2-B ariketa: 8 biteko karga paraleloko erregistroa, memoria ikusgarriarekin
12 min
Erregistro bat paraleloan jarritako N biegonkorrek osatzen dute. Ariketa honetako D biegonkorrek erloju eta reset bera dute. 8 biteko erregistroak 8 bit gordetzen ditu. Karga paraleloak sarrerako 8 bitak aldi berean kopiatzen ditu erregistrora, erlojuaren ertz batean: biegonkor bakoitzak dagokion bita hartzen du.
Memoria ikusgarri egiteko, karga-kontrola (load) erabiliko duzu. Datuak ertz guztietan hartu ordez, biegonkor soilean bezala, erregistroak karga aktibatuta dagoenean bakarrik hartuko ditu. Karga desaktibatuta dagoenean, etengailuak alda ditzakezu gordetako balioa aldatu gabe. Konexioak: SW[7:0] = datuak, KEY[0] = reset (maila baxuan aktiboa), KEY[1] = karga (maila baxuan aktiboa).
KEY maila baxuan aktibatzen denez, kargatzeko sakatu eta askatu KEY[1]. Sakatzean 0 irakurtzen da, eta kodeak !KEY[1] egiaztatzen du. KEY[1] erlojuarekin lagintzen da; ez da hardwarez erreboteak kendutako erloju-seinale bat. Diseinuak botoiaren maila egiaztatzen du goranzko ertz bakoitzean. Botoia sakatuta dagoen bitartean behin eta berriz kargatzen da; askatu ondoren, balioa gordeta geratzen da. Hori nahikoa da ariketa honetako behaketarako.
// 3. ikasgaia - 2-B ariketa: 8 biteko karga paraleloko erregistroaren txantiloia
// SW[7:0]=datuak, KEY[0]=reset, KEY[1]=karga (biak maila baxuan aktiboak).
module leds_mirror(CLOCK_50, SW, KEY, LEDR);
input CLOCK_50;
input [9:0] SW;
input [3:0] KEY;
output [9:0] LEDR;
reg [7:0] Q;
always @(posedge CLOCK_50) begin
if (!KEY[0]) Q <= TODO_RESET_VECTOR;
else if (!KEY[1]) Q <= TODO_LOAD_VALUE;
end
assign LEDR[7:0] = TODO_REGISTER_OUTPUT;
assign LEDR[9:8] = 2'b00;
endmoduleOrdeztu
leds_mirror.vfitxategiaren eduki osoa 8 biteko erregistroaren moduluarekin. Mantenduleds_mirrorizena etainput CLOCK_50;deklarazioa. Osatu TODO adierazpenak.Sakatu Sintetizatu, itxaron ondo amaitu arte, eta sakatu FPGAra igo.
Jarri etengailuak
SW[7:0] = 10101010egoeran (SW[7]da pisu handieneko bita). LEDek ez dute zertan patroi hori erakutsi oraindik: ez duzu ezer kargatu.Kargatu: sakatu eta askatu
KEY[1]. OrainLEDR[7:0]LEDek10101010erakusten dute. Erregistroak etengailuen balioak hartu ditu.Behatu memoria: aldatu etengailuak
SW[7:0] = 01010101egoerara,KEY[1]ukitu gabe. LEDak ez dira aldatzen. Erregistroak gordetako balioa mantentzen du, sarrerak desberdinak izan arren. Hori da memoria. 6. urratsera igaro aurretik, hartu egoera honen pantaila-argazkia: kamerakoLEDR[7:0]LEDek10101010erakutsi behar dute, eta pantailakoSW[7:0]etengailuek,01010101. Gorde irudiaren erreferentzia edo esteka, behean eransteko.Eguneratu: sakatu eta askatu
KEY[1]berriro. OrainLEDR[7:0]LEDek01010101erakusten dute.Berrezarri: sakatu eta askatu
KEY[0]. Zortzi LEDak itzaltzen dira (Q = 00000000), etengailuen posizioak edozein direla ere.
Klase-saio batean erabilgarri
Egin karga-sekuentzia, eta jaso 8 LEDen balioa (LEDR[7:0]) urrats bakoitzean. Funtsezko behaketa 'Etengailuak aldatuta, kargatu GABE' errenkadakoa da: gordetako balioak aurreko errenkadako bera izan behar du.
| Urratsa | SW[7:0] etengailuen balioa | KEY botoiekin egindakoa | Behatutako LEDR[7:0] balioa |
|---|---|---|---|
Erantsi zure ebidentzia. Erabili 5. urratseko pantaila-argazkia. Urrats hori argazkirik hartu gabe gainditu baduzu, errepikatu 3.–5. urratsak, eta hartu argazkia berriz kargatu edo berrezarri aurretik. Irudiak erakutsi behar du erregistroak balioa mantentzen duela. LEDR[7:0] LEDek lehen kargatutako 10101010 balioa erakutsi behar dute; aldi berean, pantailako SW[7:0] etengailuek beste patroi bat izan behar dute, adibidez 01010101, eta ez duzu KEY[1] sakatu behar aldaketa egin ondoren. Irudian, kamerako LEDak eta pantailako etengailuen posizio desberdinak agertu behar dira. Erantsi irudiaren erreferentzia edo esteka.
Bosgarren urratsean etengailuak aldatu dituzu, baina LEDak ez dira aldatu. Azaldu zergatik, «gorde» eta «kargatu» hitzak erabiliz.
Erlojuaren ertz batean reset (KEY[0]) eta karga (KEY[1]) sakagailuak biak sakatuta edukiko bazenitu, zer balio hartuko luke erregistroak, eta zergatik? Seinalatu hori erabakitzen duen kode-lerroa.
Zertarako balio du karga paraleloko erregistro batek CPU baten barruan? Eman gorde lezakeen zerbaiten adibide zehatz bat.
Eraiki duzuna eta bi reset motak
8 min
Sistema digitaletako memoria eraikitzeko bi oinarrizko elementu egin dituzu: D biegonkorra (bit bat, erlojuaren ertzean datua hartu eta mantentzen duena) eta erregistroa (paraleloan kargatutako hainbat biegonkor, karga desaktibatuta dagoenean balioa mantentzen dutenak). always @(posedge CLOCK_50) eta <= esleipen ez-blokeatzaileak erabili dituzu, eta maila baxuan aktibatzen den KEY sarrera kontrol gisa erabiltzen ikusi duzu.
Hurrengo ikasgaietarako oharra: bi reset mota. Ikasgai honetako bi diseinuek reset sinkronoa erabili dute: erloju-ertzaren blokean egiaztatzen da, eta goranzko ertzean bakarrik eragiten du. 4. ikasgaiko erloju geldoko diseinuetan, eta ondoren 5.–6. ikasgaietako egoera-makinetan, maila baxuan aktibatzen den reset asinkronoa ere ikusiko duzu. always @(posedge ... or negedge KEY[0]) blokeak erlojuaren goranzko ertzari eta resetaren beheranzko ertzari erantzuten die. Resetak zirkuitua hasierako egoera definitura eramaten du, erloju geldoaren zain egon gabe. Kameraren eguneratzeak eta sarearen atzerapenak ez dute aldaketa elektrikoaren une zehatza erakusten.
Zein sekuentzia dator bat ikasgai honetako ariketa bakoitzean egin duzunarekin?
Hiru edo lau esalditan, azaldu nola frogatu duen 2-B ariketak erregistroak memoria duela; aipatu zure datuak. Azaldu zergatik erakusten duen 2-A ariketak resetaren eragina, baina ez gordetzea, eta aipatu noiz izan den garrantzitsua KEY maila baxuan aktibatzea.
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