Teach Urruneko laborategidun ikasgaiak

Teach ikasgaia

Logika digitala DE1-SoC plakan VHDLrekin (3/6): memoria, D biegonkorrak eta erregistroak

VHDLko erlojudun prozesuekin D biegonkorra eta 8 biteko erregistroa eraikiko dituzu, eta memoria benetako hardwarean egiaztatuko duzu.

  • DE1-SoC
  • 55 min
  • Batxilergo teknologikoa, hasierako lanbide-heziketa edo lehen ikasturte teknikoak
  • eu
  • Digital systems & FPGA

Hasi saioa irakasle-kontu batekin klase-saioa prestatzeko. Ikasleak klase-kode batekin sartzen dira.

D biegonkorraren denbora-diagrama: erlojuaren uhin karratua, ertzen artean aldatzen den D datu-seinalea eta Q irteera. Q-k goranzko ertz bakoitzean D kopiatzen du, eta balio hori mantentzen du hurrengo ertzera arte.
DE1-SoC

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 prozesuetan seinale-esleipenak 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.

1

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. blink.vhd hasierako txantiloiak ez du erlojurik deklaratzen; gehitu CLOCK_50 : in std_logic entitatearen 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, CLOCK_50 : in std_logic 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.

2

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-k D-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.

D biegonkorraren denbora-diagrama: erlojuaren uhin karratua, ertzen artean aldatzen den D datu-seinalea eta Q irteera. Q-k goranzko ertz bakoitzean D kopiatzen du, eta balio hori mantentzen du hurrengo ertzera arte.

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 VHDLn: bi ideia berri.

Lehenengoa erlojudun prozesua da. Ertzean aktibatzen den portaera process(CLOCK_50) eta if rising_edge(CLOCK_50) then bidez deskribatzen da. Baldintza horren barruko seinale-esleipenek adierazten dute biegonkor bakoitzak zer hartuko duen goranzko ertzean.

Bigarrena <= seinale-esleipena da. VHDLn, Q <= SW(0); seinale bati egindako esleipena da. Erlojudun prozesu honetan, biegonkorraren balioa ertzean eguneratzea deskribatzen du. Esleipenak ez du seinalea berehala aldatzen prozesuko hurrengo lerroarentzat; eguneraketa gero aplikatzeko programatzen da. Horrela, hainbat erregistrok ertzean dituzten balio zaharrak erabil ditzakete batera eguneratzeko. VHDLko aldagaiak, berriz, := bidez esleitzen dira eta berehala aldatzen dira prozesuaren barruan. Seinale bati ezin zaio zuzenean := aplikatu. Aldagaiak erabilgarriak izan daitezke, baina ikastaro honetan gordetako balioak seinale gisa adieraziko ditugu. Arau praktikoa: erabili seinaleak eta <= biegonkorren, erregistroen, kontagailuen eta FSMen egoeraren balioak esleitzeko.

Reset sinkronoa. Q balio ezagun batera berrezartzeko kontrola ere behar dugu: reset seinalea. Reset sinkronoa goranzko ertzaren baldintzaren barruan egiaztatzen da; beraz, erlojuaren ertzean bakarrik eragiten du:

process(CLOCK_50)
begin
    if rising_edge(CLOCK_50) then
        if KEY(0) = '0' then Q <= TODO_RESET_VALUE;
        else                  Q <= TODO_D_INPUT;
        end if;
    end if;
end process;

KEY maila baxuan aktibatzen denez, sakatuta dagoenean 0 irakurtzen da. Horregatik, KEY(0) = '0' egia da reset sakagailua sakatuta mantentzen den bitartean.

Zergatik erabiltzen da Q <= SW(0); seinale-esleipena biegonkorraren irteera eguneratzeko? Zertan bereizten da VHDLko aldagai bati := bidez egindako berehalako esleipenetik? Azaldu zergatik hartu behar dituzten hainbat erregistrok laginak erlojuaren ertz berean.

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.

3

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) = not 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 not Q erakusten duen LEDR(1), itzalita.
  • KEY(0) sakatuta mantentzen baduzu (0 irakurtzen da, eta reseta aktibo dago), LEDR(0) itzali egiten da, nahiz eta SW(0) goian egon. Resetak lehentasuna du datuaren aurrean.
  • KEY(0) askatzean, LEDR(0) berriz SW(0)-ren araberakoa da.

Memoria hurrengo ariketan (2-B) ikusiko duzu argi. Hemen, egiaztatu resetak datu-sarreraren gainetik lehentasuna duela.

-- Ikaslearen txantiloia: osatu TODO lerroak sintetizatu aurretik.
-- 3. ikasgaia - 2-A ariketa: D biegonkorra.
-- SW(0)=D, KEY(0)=reset (maila baxuan aktiboa), LEDR(0)=Q, LEDR(1)=not Q.
library ieee;
use ieee.std_logic_1164.all;

entity blink is
    port (
        CLOCK_50 : in  std_logic;
        KEY      : in  std_logic_vector(3 downto 0);
        SW       : in  std_logic_vector(9 downto 0);
        LEDR     : out std_logic_vector(9 downto 0)
    );
end entity blink;

architecture rtl of blink is
    signal Q : std_logic := '0';
begin
    process(CLOCK_50)
    begin
        if rising_edge(CLOCK_50) then
            if KEY(0) = '0' then Q <= TODO_RESET_VALUE;
            else                  Q <= TODO_D_INPUT;
            end if;
        end if;
    end process;

    LEDR(0) <= TODO_Q_OUTPUT;
    LEDR(1) <= TODO_NOT_Q_OUTPUT;
    LEDR(9 downto 2) <= (others => '0');
end architecture rtl;
  1. Ireki DE1-SoC VHDL laborategia. Editoreak blink.vhd erakusten du.

  2. Ordeztu blink.vhd fitxategiaren eduki osoa goiko D biegonkorraren txantiloiarekin. Mantendu blink izena eta osatu TODO adierazpenak. Kontuan hartu CLOCK_50 : in std_logic deklarazioa: ikastaroko diseinu erlojudunek sarrera hori behar dute, entitatearen portu-zerrendan.

  3. Sakatu Sintetizatu. Gida batek botoia estaltzen badu, itxi edo saltatu lehenik. Itxaron amaitu arte (1–3 minutu inguru). Errorea badago, begiratu CLOCK_50 portu-zerrendan sartu duzun edo puntu eta komarik falta den. Zuzendu eta sintetizatu berriro. Jarraitu soilik azken egoerak 0 errore adierazten dituenean.

  4. Sakatu FPGAra igo, eta itxaron plaka eta kamera agertu arte.

  5. Jarri SW(0) goian (D=1). Egiaztatu LEDR(0) (Q) piztuta dagoela eta LEDR(1) (not Q), itzalita.

  6. Egiaztatu reseta: SW(0) goian mantenduta, sakatu eta eutsi KEY(0)-ri. Behatu LEDR(0) itzali egiten dela etengailua aldatu gabe: resetak datuaren gainetik lehentasuna du. Askatu KEY(0), eta egiaztatu LEDR(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) (not 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) = not 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.

4

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 downto 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) = '0' 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.

-- Ikaslearen txantiloia: osatu TODO lerroak sintetizatu aurretik.
-- 3. ikasgaia - 2-B ariketa: 8 biteko karga paraleloko erregistroa.
-- SW(7 downto 0)=datuak, KEY(0)=reset, KEY(1)=karga. KEY sarrerak maila baxuan aktiboak dira.
library ieee;
use ieee.std_logic_1164.all;

entity blink is
    port (
        CLOCK_50 : in  std_logic;
        KEY      : in  std_logic_vector(3 downto 0);
        SW       : in  std_logic_vector(9 downto 0);
        LEDR     : out std_logic_vector(9 downto 0)
    );
end entity blink;

architecture rtl of blink is
    signal Q : std_logic_vector(7 downto 0) := (others => '0');
begin
    process(CLOCK_50)
    begin
        if rising_edge(CLOCK_50) then
            if KEY(0) = '0' then
                Q <= TODO_RESET_VECTOR;
            elsif KEY(1) = '0' then
                Q <= TODO_LOAD_VALUE;
            end if; -- bestela, Q-k aurreko balioa mantentzen du
        end if;
    end process;

    LEDR(7 downto 0) <= TODO_REGISTER_OUTPUT;
    LEDR(9 downto 8) <= (others => '0');
end architecture rtl;
  1. Ordeztu blink.vhd fitxategiaren eduki osoa 8 biteko erregistroaren txantiloiarekin. Mantendu blink izena eta CLOCK_50 : in std_logic deklarazioa. Osatu TODO adierazpenak.

  2. Sakatu Sintetizatu, itxaron ondo amaitu arte, eta sakatu FPGAra igo.

  3. Jarri etengailuak SW(7 downto 0) = 10101010 egoeran (SW(7) da pisu handieneko bita). LEDek ez dute zertan patroi hori erakutsi oraindik: ez duzu ezer kargatu.

  4. Kargatu: sakatu eta askatu KEY(1). Orain LEDR(7 downto 0) LEDek 10101010 erakusten dute. Erregistroak etengailuen balioak hartu ditu.

  5. Behatu memoria: aldatu etengailuak SW(7 downto 0) = 01010101 egoerara, 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: kamerako LEDR(7 downto 0) LEDek 10101010 erakutsi behar dute, eta pantailako SW(7 downto 0) etengailuek, 01010101. Gorde irudiaren erreferentzia edo esteka, behean eransteko.

  6. Eguneratu: sakatu eta askatu KEY(1) berriro. Orain LEDR(7 downto 0) LEDek 01010101 erakusten dute.

  7. 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 downto 0)) urrats bakoitzean. Funtsezko behaketa 'Etengailuak aldatuta, kargatu GABE' errenkadakoa da: gordetako balioak aurreko errenkadako bera izan behar du.

Urratsa SW(7 downto 0) etengailuen balioa KEY botoiekin egindakoa Behatutako LEDR(7 downto 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 downto 0) LEDek lehen kargatutako 10101010 balioa erakutsi behar dute; aldi berean, pantailako SW(7 downto 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.

5

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). rising_edge(CLOCK_50) duen VHDL prozesua eta <= seinale-esleipenak 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: rising_edge baldintzaren barruan 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. Reset-seinalea prozesuaren sentikortasun-zerrendan sartzen da, adibidez process(..., KEY), eta if KEY(0) = '0' then ... adarra erlojuaren adarraren aurretik jartzen da. Horrek 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.