Teach ikasgaia
Logika digitala DE1-SoC plakan VHDLrekin (4/6): kontagailuak eta aukerako desplazamendu-erregistroak
Eraiki kontagailua eta erloju-zatitzailea VHDLn; astirik badago, probatu BCD eta desplazamenduko aukerako ariketak.
Hasi saioa irakasle-kontu batekin klase-saioa prestatzeko. Ikasleak klase-kode batekin sartzen dira.
Lehen aldia duzu LabsLand-en? Sortu irakasle-kontua
Ikaskuntza-emaitzak
Erloju-zatitzaileak zer egiten duen azaltzea eta erabiltzea, 50 MHz-eko erlojuak gidatutako portaera kameran bereizi ahal izateko.
4 biteko kontagailua eraikitzea eta haren balioa LEDetan eta 7 segmentuko bistaratzailean irakurtzea.
Astirik badago, BCD eta desplazamendu-erregistroak aukerako ariketetan aztertzea.
Erregistroaren bit kopuruarekin lotutako arazoak antzematea; adibidez, deklaratutako erregistroan sartzen ez den konstantea.
Ikaslearen jardueraren aurrebista
Jardueraren edukia
Aurrebista soilik. Klase-saio batean, ikasleek erantzunak bete eta lana irakasleari bidal diezaiokete.
Gordetzetik aldatzera: zergatik behar dugu erloju-zatitzailea?
10 min
Hirugarren ikasgaian bit bat edo byte bat gogoratzen duten zirkuituak eraiki zenituen: biegonkorra eta karga paraleloko erregistroa. Erloju-ertzean eguneratzen dute gordetako balioa. Orain, ideia bera erabiliko duzu ertz bakoitzean berez aurrera egiten duen kontagailua eraikitzeko: 0, 1, 2, 3, .... Astirik badago, bitak alde baterantz mugitzen dituen desplazamendu-erregistroa ere probatuko duzu aukerako ariketan.
Plakaren erlojua CLOCK_50 da: 50 MHz-eko uhin karratua, hau da, 50.000.000 goranzko ertz segundo bakoitzean. Kontagailuak CLOCK_50 erlojuaren ertz bakoitzean urrats bat egingo balu, 4 biteko kontagailuaren 16 balioak segundoan hiru milioi aldiz baino gehiagotan zeharkatuko lituzke. Ez zenituzke urratsak banaka bereiziko. Urruneko kamerak segundoan fotograma gutxi batzuk besterik ez ditu hartzen, eta ezingo luke sekuentzia horri jarraitu.
Horregatik moteltzen dugu aldaketen erritmoa erloju-zatitzaile batekin. Funtsean, beste kontagailu bat da: CLOCK_50 erlojuaren ertzak zenbatzen ditu eta, DIV mugara iristean, slow_clk izeneko seinale motelagoa alderantzikatu eta berriz hasten da. DIV zenbat eta handiagoa izan, orduan eta motelagoa da slow_clk. Ondoren, seinale hori erabiltzen dugu zirkuitu nagusia —4 biteko kontagailua edo desplazamendu-erregistroa— gidatzeko, CLOCK_50 zuzenean erabili beharrean.
Diseinu sekuentzialek erlojua deklaratu behar dute. Hasierako blink.vhd txantiloiak ez du erloju-sarrerarik; beraz, ikasgai honetako entitate guztiek CLOCK_50 : in std_logic gehitzen dute portu-zerrendan. Plakaren seinaleak lehengoak dira: SW(9 downto 0) (etengailua gora = 1), KEY(3 downto 0) (maila baxuan aktibo: sakatuta = 0), LEDR(9 downto 0) (maila altuan aktibo: 1 denean piztuta) eta HEX0–HEX5 (zazpi segmentuak maila baxuan aktibo).
Zatitzaileak CLOCK_50 erlojuaren ertz azkarrak zenbatzen ditu, eta DIV mugara iristen den bakoitzean slow_clk alderantzikatzen du. DIV handitzeak aldaketak moteltzen ditu. Zirkuitu nagusiak slow_clk erabiltzen du, haren urratsak kameran bereizteko. Uhinak eskematikoki marraztuta daude, denbora-eskala desberdinetan.
CLOCK_50 erlojuari zuzenean konektatutako 4 biteko kontagailuak segundoan 50 milioi urrats egiten ditu. 16 egoeren sekuentzia osoa segundoan 3,125 milioi aldiz errepikatzen da. Kamerak segundoan fotograma gutxi batzuk hartzen ditu. Zer bereiziko zenuke LEDetan, eta zergatik?
DIV muga bikoiztuko bazenu —adibidez, 33_333_333 balioaren ordez 66_666_666 erabiliz—, nola aldatuko litzateke gutxi gorabehera kontagailuaren aurreratze-abiadura? Azaldu zergatik, esaldi batean.
2-C ariketa: erloju-zatitzailea duen 4 biteko kontagailua
12 min
Kontagailua erregistro bat da, eta haren hurrengo balioa oraingo balioa gehi bat da. 4 biteko kontagailuak 0 eta 15 arteko balioak gordetzen ditu. 15 ondoren, automatikoki 0 baliora itzultzen da: 15 + 1 = 16 = 10000 bitarrez, baina pisu txikieneko lau bitak soilik gordetzen dira (0000). Itzulera hori ez da bereziki programatu behar: erregistroaren bit kopuruaren ondorioa da.
Beheko diseinuak bi zati ditu. Zatitzaileak CLOCK_50 erlojuaren ertzak zenbatzen ditu DIV mugara arte, eta slow_clk alderantzikatzen du. Kontagailuak unitate bat aurrera egiten du slow_clk seinalearen goranzko ertz bakoitzean; KEY(0) sakatzeak, berriz, 0 baliora eramaten du (reset: maila baxuan aktibo). Balioa bitarrez erakusten da LEDR(3 downto 0) irteeran, eta digitu hamaseitar gisa HEX0 bistaratzailean: 0–9, eta ondoren A–F, 10–15 balioetarako. Osatu kodeko TODO markatzaileak. Txantiloiko seg funtzioak 0–F balioak zazpi segmentuen patroi bihurtzen ditu; segmentuak maila baxuan aktibo dira. count unsigned motakoa da, eta LEDetara bidaltzeko std_logic_vector bihurtu behar da. Hasierako zatitzaile-balioa to_unsigned(33_333_333, 27) da.
Denborak zehazki. Zatitzaileak 0 balioa ere zenbatzen duenez, slow_clk DIV + 1 goranzko ertzetik behin alderantzikatzen da. DIV = 33_333_333 bada, 33.333.334 ertz behar dira: 50.000.000 ertz/s-ko erritmoan, gutxi gorabehera 0,67 s. Kontagailuak slow_clk seinalearen goranzko ertzean bakarrik egiten du aurrera. Ondoz ondoko goranzko ertzen artean periodo osoa igarotzen da —igoera eta jaitsiera—; beraz, kontagailuak 1,33 s-tik behin egiten du urrats bat, 0,75 Hz inguruko maiztasunez. Resetaren ondoren, lehen urratsa 0,67 s ingurura iristen da; hurrengoen arteko tartea 1,33 s ingurukoa da.
Bit kopuruarekin lotutako ohiko arazoa. Kontagailu honetako zatitzailearen erregistroak 27 bit ditu. 26 biteko erregistroak gehienez 2^26 − 1 = 67.108.863 gorde dezake. Beraz, DIV = 100_000_000 ez da sartzen 26 bitetan. 27 bitekin, gehieneko balioa 2^27 − 1 = 134.217.727 da; hortaz, bai DIV = 100_000_000 (motelagoa), bai DIV = 8_333_333 (azkarragoa), sartzen dira. Egiaztatu beti konstantea deklaratutako erregistroan sartzen dela.
Diseinu honen muga. slow_clk beste erregistro baten erloju gisa erabiltzea baliabide didaktikoa da: urratsak ikustea errazten du. Benetako aplikazioetarako, oro har, CLOCK_50 erloju azkar bera erabiltzen da diseinu osoan, erloju-gaikuntza (clock enable) batekin: ziklo bateko pultsuak adierazten du zein ertzetan eguneratu behar den egoera. Horrela, erloju bakarra dago, eta sintesi-tresnek errazago aztertzen dute haren denborazko portaera. Hemen zatitutako erlojua erabiltzen dugu kontagailuaren funtzionamendua ikusteko.
-- Ikaslearen txantiloia: osatu TODO lerroak sintetizatu aurretik.
-- 4. ikasgaia - 2-C ariketa: 4 biteko kontagailua erloju-zatitzailearekin.
-- KEY(0)=reset. LEDR(3 downto 0)=count; HEX0=kontaera digitu hamaseitar gisa.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity blink is
port (
CLOCK_50 : in std_logic;
KEY : in std_logic_vector(3 downto 0);
LEDR : out std_logic_vector(9 downto 0);
HEX0 : out std_logic_vector(6 downto 0)
);
end entity blink;
architecture rtl of blink is
constant DIV : unsigned(26 downto 0) := TODO_VISIBLE_DIVIDER;
signal div_count : unsigned(26 downto 0) := (others => '0');
signal slow_clk : std_logic := '0';
signal count : unsigned(3 downto 0) := (others => '0');
function seg(d : unsigned(3 downto 0)) return std_logic_vector is
begin
case d is
when "0000" => return "1000000"; when "0001" => return "1111001";
when "0010" => return "0100100"; when "0011" => return "0110000";
when "0100" => return "0011001"; when "0101" => return "0010010";
when "0110" => return "0000010"; when "0111" => return "1111000";
when "1000" => return "0000000"; when "1001" => return "0010000";
when "1010" => return "0001000"; when "1011" => return "0000011";
when "1100" => return "1000110"; when "1101" => return "0100001";
when "1110" => return "0000110"; when "1111" => return "0001110";
when others => return "1111111";
end case;
end function;
begin
process(CLOCK_50)
begin
if rising_edge(CLOCK_50) then
if KEY(0) = '0' then
div_count <= (others => '0');
slow_clk <= '0';
elsif div_count = TODO_DIVIDER_LIMIT then
div_count <= (others => '0');
slow_clk <= not slow_clk;
else
div_count <= div_count + 1;
end if;
end if;
end process;
process(slow_clk, KEY)
begin
if KEY(0) = '0' then count <= (others => '0');
elsif rising_edge(slow_clk) then count <= TODO_NEXT_COUNT;
end if;
end process;
LEDR(3 downto 0) <= TODO_LED_COUNT;
LEDR(9 downto 4) <= (others => '0');
HEX0 <= TODO_HEX_COUNT;
end architecture rtl;Zatitzailean 24 biteko erregistroa erabiliko bazenu, zein litzateke gorde lezakeen baliorik handiena? Kalkulatu 2^24 − 1, eta azaldu esaldi batean ea DIV = 33_333_333 sartuko litzatekeen.
Exekutatu kontagailua eta egin reset
10 min
Eraiki kontagailua benetako plakan, behatu nola zenbatzen duen eta egin reset. Astirik badago, probatu zatitzailearen beste bi balioak ere.
Ireki DE1-SoC plakaren VHDL laborategia. Editorean
blink.vhdagertzen da.Ordeztu
blink.vhdfitxategiko eduki guztia osatu duzun 4 biteko kontagailuarekin. Mantendublinkizena. Kontuan hartuCLOCK_50 : in std_logicdeklaratu behar dela: hasierako txantiloiak ez du erlojua berez gehitzen.Sakatu Sintetizatu. Gida batek botoia estaltzen badu, itxi edo saltatu gida. Itxaron prozesua amaitu arte (1–3 min inguru). Zuzendu idazketa-akatsak eta sintetizatu berriz. Quartus-ek denborazko portaerari buruzko abisuak erakuts ditzake zatitzaile didaktiko honekin; jarraitzeko, amaierako emaitzak 0 errore izan behar ditu. Abisuak ulertzen ez badituzu, galdetu irakasleari.
Sakatu FPGAra igo eta itxaron plaka eta kamera prest egon arte. Sakatu eta askatu
KEY(0), zirkuitua egoera ezagun batean hasteko.Behatu
LEDR(3 downto 0)etaHEX0. Balio berri bat agertu behar da 1,33 s-tik behin, gutxi gorabehera (0,75 urrats/s). Egiaztatu LEDetako balio bitarra etaHEX0digitu hamaseitarra bat datozela; adibidez,HEX0bistaratzaileakCerakustean,LEDR(3 downto 0)patroia1100izan behar da.Eutsi
KEY(0)sakatuta kontagailua0balioan mantentzeko; askatu eta behatu nola hasten den berriz0-tik zenbatzen.Aukerakoa, astirik badago: aldatu
DIVbalioato_unsigned(8_333_333, 27)izatera, sintetizatu, igo eta egin reset; kontagailua azkarrago ibiliko da. Ondoren, probatuto_unsigned(100_000_000, 27): motelago ibiliko da. Bi balioak sartzen dira 27 bitetan. Proba hau ez da derrigorrezko froga.
Klase-saio batean erabilgarri
DIV = 33_333_333 erabiliz, behatu kontagailua eta jaso balio batzuk. Idatzi LEDR(3 downto 0) patroi bitarra eta HEX0 bistaratzailean ikusten duzun karakterea (0–9 eta ondoren A–F). Egin reset KEY(0) erabiliz eta egiaztatu kontagailua 0 baliora itzultzen dela.
| Behaketa zk. | LEDR(3 downto 0) (bitarrez) | HEX0-ko karakterea | Balio hamartarra (0–15) |
|---|---|---|---|
Jaso zure ebidentzia. Itxaron HEX0 bistaratzaileak C (12 hamartarrez) erakutsi arte, eta hartu kameraren irudi bat: aldi berean, LEDR(3 downto 0) patroia 1100 izan behar da. Gehitu behean irudiaren erreferentzia edo esteka.
Aukerako proban DIV = 8_333_333 eta DIV = 100_000_000 erabili badituzu, erantzun: zeinekin egin du kontagailuak azkarrago aurrera? Bi zenbaki horiek erabiliz, kalkulatu gutxi gorabehera zenbat aldiz azkarragoa den bata bestea baino.
Kontagailua erloju gisa erabili nahi duzu, 24 orduko egun oso batean gehienez segundo bateko aurrerapena edo atzerapena izan dezan. Kontagailuaz gain, zer zaindu beharko zenuke? Aipatu funtsezko osagaia eta azaldu zergatik den garrantzitsua.
Aukerako ariketa: 0tik 9ra zenbatzen duen BCD kontagailua
7 min
4 biteko kontagailu arruntak 0–15 balioak zeharkatzen ditu eta azken seietan A–F erakusten du. Bistaratzaile askotan, ordea, digitu hamartar bakarra nahi dugu: 0, 1, 2, ..., 9 zenbatu eta zuzenean 0 baliora itzuli. 0–9 soilik zenbatzen duen kontagailu horri BCD kontagailu deritzo (binary-coded decimal: bitarrez kodetutako hamartarra).
Aldaketa txikia da: 4 biteko erregistroari 15 ondoren berez 0 baliora itzultzen utzi beharrean, 9 detektatu eta hurrengo balioa 0 izatera behartzen duzu. Ordeztu kontagailuaren prozesua behekoarekin eta osatu TODOak:
process(slow_clk, KEY)
begin
if KEY(0) = '0' then count <= TODO_RESET_COUNT;
elsif rising_edge(slow_clk) then
if count = TODO_LAST_BCD_DIGIT then count <= TODO_WRAP_VALUE;
else count <= TODO_NEXT_COUNT;
end if;
end if;
end process;
Utzi gainerakoa dagoen bezala: zatitzailea, LEDR/HEX0 esleipenak eta seg funtzioa. Orain HEX0 bistaratzaileak 0–9 zeharkatu behar ditu, A–F erakutsi gabe.
Moldatu zure kontagailuaren prozesua
9ondoren0baliora itzul dadin, goian adierazi bezala.Sintetizatu, zuzendu idazketa-akatsak eta kargatu diseinua FPGAra.
Behatu
HEX0sekuentzia:0, 1, 2, ... 9, 0, 1, .... Egiaztatu ez dela inoizAagertzen. SakatuKEY(0)hasieratik behatu nahi baduzu.
Klase-saio batean erabilgarri
BCD kontagailuan, zer balio hartzen du count erregistroak HEX0 bistaratzailean 9 agertu ondorengo lehen erloju-ertzean? Zer kode-lerrok eragiten du aldaketa hori?
Aukerako ariketa: 8 biteko desplazamendu-erregistroa
9 min
Desplazamendu-erregistroa biegonkorren lerro bat da: erloju-ertz bakoitzean bit bakoitza ondoko posiziora pasatzen da eta mutur batetik bit berri bat sartzen da. Serieko komunikazio askoren oinarrizko ideia da. UART, SPI eta I2C protokoloek, adibidez, datuak bitez bit bidaltzen dituzte; desplazamendu-erregistroak bitak byte batean bildu edo byte bat bitetan banatu dezake.
Beheko diseinuan shreg(7 downto 0) 8 biteko erregistroa dago. Desplazamendua gaituta dagoenean, slow_clk seinalearen goranzko ertz bakoitzean honela eguneratzen da:
shreg <= TODO_SHIFT_LEFT_UPDATE; -- TODO: desplazatu ezkerrera eta sartu SW(0) 0. bitean
Osatu eskuineko adierazpena arretaz: hartu pisu txikieneko zazpi bitak, shreg(6 downto 0), eraman bakoitza posizio bat gorago eta sartu SW(0) balioa 0 bitean. Bitak pisu handiagoko muturrerantz doazenez, ezkerrerako desplazamendua da. Kontrolak: SW(0) = serieko sarrerako bita; KEY(0) = reset (maila baxuan aktibo); KEY(1) = desplazamendua gaitzea (maila baxuan aktibo: eutsi sakatuta urrats bakoitzean desplazatzeko).
Espero den patroia. Arrazoitu biten balioekin, kameraren orientazioaz bakarrik fidatu gabe. Hasi 0000_0000 egoeran. Jarri SW(0) = 1 eta utzi lau urrats igarotzen: erregistroa 0 bitetik gorantz betetzen da, 0000_0001, 0000_0011, 0000_0111 eta 0000_1111 emanez. Ondoren, jarri SW(0) = 0 eta utzi beste lau urrats igarotzen. Zeroak 0 bitetik sartzen dira eta batekoak gorantz bultzatzen dituzte: 0001_1110, 0011_1100, 0111_1000 eta, azkenik, 1111_0000. Beraz, lau 1 eta ondoren lau 0 sartuta, shreg(7 downto 0) balioa 1111_0000 da.
Biten balioa eta kamerako irudia. Jaso biak: erregistroaren balio bitarra eta kameran ikusten duzuna. Bitak shreg(7) ezkerrean eta shreg(0) eskuinean idazten ditugu. Kameraren orientazioaren arabera, LEDen kokapena alderantziz ikus liteke. Egiaztatu LEDR indizeak: orientazioaren ondorioa da balio bera alderantziz ikustea, baina ez du bestelako patroi oker bat justifikatzen. Horregatik gordeko dituzu kalkulatutako balioa eta irudia.
Txantiloi honetako zatitzaileak ere 27 bit ditu. Erabili hasieran to_unsigned(33_333_333, 27). VHDLko & eragileak bitak kateatzen ditu: ezkerrerako eguneratzean zazpi bitak eta sarrerako bit berria elkartuko dituzu.
-- Ikaslearen txantiloia: osatu TODO lerroak sintetizatu aurretik.
-- 4. ikasgaia - 2-D ariketa: 8 biteko ezkerrerako desplazamendu-erregistroa.
-- SW(0)=serieko sarrerako bita; KEY(0)=reset; KEY(1)=gaikuntza. KEY sarrerak maila baxuan aktiboak dira.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.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
constant DIV : unsigned(26 downto 0) := TODO_VISIBLE_DIVIDER;
signal div_count : unsigned(26 downto 0) := (others => '0');
signal slow_clk : std_logic := '0';
signal shreg : std_logic_vector(7 downto 0) := (others => '0');
begin
process(CLOCK_50)
begin
if rising_edge(CLOCK_50) then
if KEY(0) = '0' then
div_count <= (others => '0'); slow_clk <= '0';
elsif div_count = DIV then
div_count <= (others => '0'); slow_clk <= not slow_clk;
else
div_count <= div_count + 1;
end if;
end if;
end process;
process(slow_clk, KEY)
begin
if KEY(0) = '0' then
shreg <= (others => '0');
elsif rising_edge(slow_clk) then
if KEY(1) = '0' then shreg <= TODO_SHIFT_UPDATE;
end if;
end if;
end process;
LEDR(7 downto 0) <= TODO_SHIFT_OUTPUT;
LEDR(9 downto 8) <= (others => '0');
end architecture rtl;Hasi 0000_0000 egoeran. KEY(1) sakatuta mantenduz, sartu SW(0) = 1, 1, 0, 1 sekuentzia lau urratsetan; zerrendako lehen bita sartzen da lehenengo. Idatzi tarteko egoerak, eta adierazi shreg(7 downto 0) balioa lau urratsen ondoren.
Aukerako ariketa: mugitu bitak LEDen lerroan zehar
9 min
Eraiki desplazamendu-erregistroa. Behatu nola sartzen eta mugitzen diren batekoak, eta nola datozen ondoren zeroak.
Ordeztu
blink.vhdfitxategiko edukia osatu duzun 8 biteko desplazamendu-erregistroarekin. Mantendublinkizena etaCLOCK_50 : in std_logicdeklarazioa.Sintetizatu, zuzendu idazketa-akatsak eta kargatu diseinua FPGAra.
Sakatu eta askatu
KEY(0), erregistroa zeroz betetzeko (LEDR(7 downto 0)LED guztiak itzalita).Jarri
SW(0)gora (serieko sarrera =1) eta eutsiKEY(1)sakatuta. Urrats bakoitzean (1,33 s inguru), beste bateko bat sartzen da mutur batetik eta aurrekoak desplazatzen dira. Lau urratsen ondoren, lau LED piztuta egon behar dira (0000_1111). Askatu gaikuntza une horretan, sarrera lasai aldatzeko. Kameraren atzerapenagatik urrats gehiago egin baditu, egin reset eta errepikatu.Jarri
SW(0)behera (serieko sarrera =0), eutsi berriroKEY(1)sakatuta eta utzi beste lau urrats igarotzen. Zeroak batekoen atzetik sartuko dira, erregistroak1111_0000balioa izan arte.Askatu
KEY(1)patroia mantendu nahi duzunean, irakurri edo irudia hartu ahal izateko.
Klase-saio batean erabilgarri
Egin reset eta eutsi KEY(1) sakatuta. Jaso egoera urratsez urrats: lau urrats SW(0)=1 izanik eta beste lau SW(0)=0 izanik. Idatzi shreg zortzi biten bidez, shreg(7) ezkerrean eta shreg(0) eskuinean. Azken zutabean, azaldu kamerako LEDen kokapena idatzitako biten ordenarekin alderatuta; erabili LEDen indizeak.
| Urrats zk. | SW(0) sarrera | shreg(7 downto 0) (8 bit) | Kamera: zer LED? Zer orientazio? |
|---|---|---|---|
Jaso zure ebidentzia. SW(0)=1 izanik lau urrats eta SW(0)=0 izanik beste lau egin ondoren, askatu KEY(1) patroia mantentzeko (shreg = 1111_0000). Hartu kameraren irudi bat, jaso LEDen orientazioa eta gehitu irudiaren erreferentzia edo esteka.
Alderatu kalkulatutako 1111_0000 balio bitarra zure irudian piztuta dauden LEDekin. LEDen ordena alderantziz ikusten bada, azaldu indizeak erabiliz nola bereizten dituzun orientazioaren ondorioa eta desplazamendu-logikaren akatsa.
Aukerakoa: eskuinera desplazatzea eta eraztun-kontagailua
6 min
Desplazatu kontrako noranzkoan. Erregistroa ezkerrera beharrean eskuinera desplazatzeko, bit bakoitza pisu txikiagoko muturrerantz mugitzen da, eta bit berria goiko muturretik sartzen da (shreg(7)). Lerro bakarra aldatu behar duzu. Ordeztu ezkerrerako desplazamenduaren markatzailea zuk idatzitako eskuinerako adierazpenarekin:
shreg <= TODO_SHIFT_RIGHT_UPDATE; -- TODO: desplazatu eskuinera eta sartu SW(0) 7. bitean
Aldatu lerro hori bakarrik. Orain SW(0) balioa shreg(7) bitean sartzen da, eta pisu handieneko zazpi bitak, shreg(7 downto 1), shreg(6 downto 0) posizioetara jaisten dira.
Hedapena: eraztun-kontagailua. Eraztun-kontagailuak erregistroaren irteera sarrerara berrelikatzen du; horrela, patroi batek etengabe bira egiten du. Eraiki ezkerrera desplazatzen den eraztuna: goiko bita beheko bitera eraman, eta reset egitean kargatu 0000_0001, piztutako LED bakarrak lerroari bira eman diezaion. Resetak "00000001" kargatu behar du, ez "00000000"; desplazamendu-lerroa shreg <= shreg(6 downto 0) & shreg(7); da. Eutsi KEY(1) sakatuta eta behatu LED bakarraren ibilbidea.
Aldatu zure diseinuaren desplazamendu-lerroa, goian azaldutako eskuinerako desplazamendua egiteko. Sintetizatu eta kargatu.
Egin reset, eutsi
KEY(1)sakatuta, eta erabiliSW(0)=1lau urratsetan etaSW(0)=0hurrengo lauetan. Egiaztatu bitak kontrako noranzkoan mugitzen direla LEDen lerroan.(Aukerako hedapena) Eraiki eraztun-kontagailua: resetak
"00000001"kargatzen du, eta desplazamendu-lerroakshreg(7)bita0bitera berrelikatzen du. EutsiKEY(1)sakatuta eta behatu LED bakarra nola dabilen biraka.
Klase-saio batean erabilgarri
Eskuinera desplazatzen duen shreg <= SW(0) & shreg(7 downto 1); bertsioan, hasi 0000_0000 egoeran eta sartu SW(0) = 1 lau urratsetan. Zein muturretatik betetzen da erregistroa? Zer balio du shreg(7 downto 0) erregistroak lau urratsen ondoren?
Zer eraiki duzu?
4 min
Azaldu hiru esalditan: (1) erloju-zatitzaileak zer egin duen kontagailuaren urratsak ikusi ahal izateko; (2) kontagailuaren HEX0 irteeraren zer derrigorrezko froga zehatz jaso duzun; eta (3) zer arazo saihestu duzun, adibidez zatitzailearen bit kopuruan sartzen ez den konstante bat erabiltzea. BCD edo desplazamenduko aukerako ariketarik egin baduzu, gehitu haren froga beste esaldi batean.
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