Numarator Binar si BCD cu Controlul Intrarilor

34
Lab Numarator binar si BCD cu controlul intrarilor 23 Obiective Dupa parcurgerea acestui laborator veti fi in masura sa: Proiectati numaratorul binar presetabil in VHDL. Proiectati numaratorul BCD 1 presetabil in VHDL. Simulati functionarea numaratoarelor. Testati iesirile numaratorului. Referinte Dueck, Robert K., Digital Design with CPLD Applications and VHDL, 2/e Capitolul 9: Counters and Shift Registers 9.1 Basic Concepts of Digital Counters 9.2 Synchronous Counters 9.3 Design of Synchronous Counters 9.4 Programming Binary Counters in VHDL 9.5 Control Options for Synchronous Counters 9.6 Programming Presettable and Bidirectional Counters in VHDL 1 ”Binary coded decimal” - cod in care fiecare cifra individuala a unui numar zecimal este reprezentata de un numar binar pe 4 biti (exemplu: 905 (zecimal) = 1001 0000 0101 (BCD)).

Transcript of Numarator Binar si BCD cu Controlul Intrarilor

Page 1: Numarator Binar si BCD cu Controlul Intrarilor

Lab

Numarator binar si BCD cu controlul intrarilor 23

Obiective Dupa parcurgerea acestui laborator veti fi in masura sa: Proiectati numaratorul binar presetabil in VHDL. Proiectati numaratorul BCD1 presetabil in VHDL. Simulati functionarea numaratoarelor. Testati iesirile numaratorului.

Referinte Dueck, Robert K., Digital Design with CPLD Applications and VHDL, 2/eCapitolul 9: Counters and Shift Registers

9.1 Basic Concepts of Digital Counters 9.2 Synchronous Counters

9.3 Design of Synchronous Counters 9.4 Programming Binary Counters in VHDL 9.5 Control Options for Synchronous Counters

9.6 Programming Presettable and Bidirectional Counters in VHDL

Echipament Placa FPGA de testare Spartan 3necesar Xilinx ISE 10.1 software + ModelSim XE III 6.3c

Adaptor AC, iesire minima: 7 VDC, 250 mA DCManseta antistaticaFire cu miez solidCleste pentru dezizolat cabluri

1 ”Binary coded decimal” - cod in care fiecare cifra individuala a unui numar zecimal este reprezentata de un numar binar pe 4 biti (exemplu: 905 (zecimal) = 1001 0000 0101 (BCD)).

Page 2: Numarator Binar si BCD cu Controlul Intrarilor

Notiuni Experimentale

Proiectarea numaratorului binar si BCD in VHDL

Numaratoarele pot fi proiectate in VHDL cu functii precum activare, controlul directional (crescator sau descrescator), resetare sincrona si incarcare (presetare) sincrona sau asincrona. Aceste functii pot fi implimentate asignand o valoare unei variabile count sau direct modificand un port de iesire, depinzand de conditiile specifice din blocurile IF ale unui unui PROCESS. Pentru mai multe detalii consultati sectiunea 9.6 din manualul Digital Design with CPLD Applications and VHDL, 2/e.

Un numarator pe 2 digiti poate numara de la 00 pana la 99 si apoi se intoarce la 00. Valori reprezentand un numar hexazecimal de la A la F nu este valid in acest cod.

Pentru numaratorul BCD pe 2 digiti folositi doua iesiri paralele pe 4 biti: o iesire pentru digitul unitatilor si a doua pentru digitul zecilor. Mai simplu decat o incrementare a unei variabile cu rangul intre 0 si 255, folositi doua variabile, fiecare luand valori de la 0 la 9. Cand cifra unitatilor este 9, trebuie sa ia valoarea 0 la urmatoarea incrementare si cifra zecilor se incrementeaza cu 1. Daca amandoua variabile sunt 9, ele trebuie sa devina 0 la urmatoarea incrementare. Dupa fiecare puls de ceas amandoua variabilele trebuie asignate la pinii de iesire, unde pot fi afisate direct ca numere binare sau decodate spre dispozitivul de afisare.

Cerinte

1. Numaratorul BCD

Pasul 1. Scrieti o fisier VHDL pentru numaratorul BCD pe 2 digiti cu resetare asincrona pe front descrescator (active-LOW asynchronous ), incarcare sincrona pe front crescator (active-HIGH synchronous), activare a numaratorului pe front crescator si directionarea (direction) ce face ca circuitul sa numere crescator pentru DIRECTION=1 si descrescator pentru DIRECTION=0.

Salvati fisierul cu numele ct2bcd.vhdl

Numaratorul trebuie sa numere de la 00 la 09, apoi de la 10 la 19 pana cand ajunge la 99. In acest moment numaratorul o va lua de la capat cu valoarea 00. Intrarile binare paralele trebuie sa incarce orice valoare de la 0 la 9. Daca intrarile binare paralele nu sunt valabile pentru numaratorul BCD (valoarea lor este intre “1010” si “1111”) pe fiecare digit se va afisa valoarea 9.

Pasul 2. Realizati un fisier de testare(Test Bench Waveform) pentru numaratorul BCD pe 2 digiti. Simularea trebuie sa contina un ciclu complet al numaratorului ce va permite testarea tuturor functiilor.

Salvati fisierul cu numele ct2bcd_tbh.tbw

Page 3: Numarator Binar si BCD cu Controlul Intrarilor

2. Numaratorul binar presetat

Pasul 1. Scrieti o fisier VHDL pentru numaratorul binar pe 8 biti cu resetare (reset) asincrona pe front descrescator (active-LOW aynchronous ), incarcare (load) sincrona pe front crescator, activarea (enable) numaratorului pe front crescator, si directionare (direction).

Salvati fisierul cu numele ct8bit.vhdl

Pasul 2. Realizati un fisier de testare (Test Bench Waveform). Simularea trebuie sa contina un ciclu complet al numaratorului si testarea tuturor functiilor. Trebuie verificat daca incarcarea sincrona este cu adevarat sincrona si ca resetarea are prioritate fata de incarcare, care are prioritate fata de activarea numaratorului.

Folositi aceste criterii pentru a crea o simulare in ModelSim XE III 6.3cSalvati fisierul cu numele ct8bit_tbh.tbw

Rezolvarea pas cu pas a cerintelor laboratorului

1. Descrierea aplicaţiei

La fel ca in orice limbaj evoluat de programare proiectarea ierarhizată a aplicaţiilor in VHDL, prin utilizarea modulelor, permite descrierea proiectului pe mai multe nivele, îmbunătăţeşte lizibilitatea şi permite reutilizarea unor module.

Un proiect ierarhizat este alcătuit din mai multe module. O aplicaţie poate fi descrisă la nivelul cel mai de sus (top) printr-o sursă VHDL. În această sursă se definesc interfeţe corespunzătoare cu alte module situate pe nivele inferioare, module care descriu părţi componente ale aplicaţiei

Nu există o limită a numărului de nivele ierarhice pe care un proiect poate să-l conţină. Principalul avantaj al proiectării ierarhizate a unei aplicaţii este acela că încurajează modularizarea. Alt avantaj este că permite organizarea proiectului pe nivele corespunzătoare de abstractizare şi detaliu precum si reutilizarea unor module.

În sursa VHDL de pe nivelul top se vor utiliza cuvintele cheie (instrucţiunile)component şi PORT MAP pentru a instanţia modulele de pe nivelele inferioare.

Vom ilustra conceptele de ierarhizare, modularizare şi reutilizare cu o aplicaţie care presupune implementarea unui numărător binar pe 8 biti bidirecţional (poatenumăra in sus sau in jos), resetabil (poate fi adus in starea iniţială, starea 0), presetabil (poate incarca un vector de 8 biti, setand astfel numaratorul cu acest numar). Vectorul de iesire reprezinta un vector binar pe 8 biti in care primii patru biti reprezinta cifra unitatilor, iar ultimii 4 cifra zecilor.

Page 4: Numarator Binar si BCD cu Controlul Intrarilor

Mai intai trebuie implementat un numarator pe 4 biti ce va numara de la 0 la 9 (modulo 10), cu numele count09.vhdl. Acesta va avea toate functionalitatile numaratorului binar BCD , inclusiv reset asincron pe front descrescator, load sincron pe front crescator, enable pe front crescator. Mai mult decat atat acesta va returna, pe langa numarul intre 0 si 9, o valoare pe un bit care va fii 1 atunci cand numaratoarea crescatoare a ajuns pe pozitia 9 (“1001”) sau numaratoarea descrescatoare a ajuns pe pozitia 0 (“0000”). Cu ajutorul acestui numarator modulo veti putea realiza un numarator BCD pe cati digiti doriti.

2. Crearea fisierului sursa VHDL a numaratorului modulo 10

Dupa deschiderea aplicatiei Xilinx ISE, se creeaza un proiect nou alegand din meniul File, optiunea New Project.... In fereastra nou aparuta pe ecran, se completeaza campurile in functie de datele proiectului:

- numele proiectului;- locatia unde va fi salvat proiectul;- tipul proiectului

apoi se da Next.

Atentie! In numele proiectului nu vor fi lasate spatii libere; cuvintele vor fi unite prin linii sau underline-uri. In caz contrar, programul va ridica o eroare.

Page 5: Numarator Binar si BCD cu Controlul Intrarilor

Se ajunge la fereastra setarilor proiectului in functie de dispozitivul pentru care va fi creat. Se va alege:

- produs tinta: Spartan 3;- simulator: Modelsim-XE VHDL;- limbaj de programare: VHDL,

apoi se apasa butonul Next.

Sunteti interogati daca doriti crearea unei surse noi pentru proiect. Veti alege optiunea New Source…, pentru a crea un fisier sursa in cadrul proiectului.

Page 6: Numarator Binar si BCD cu Controlul Intrarilor

in fereastra aparuta veti selecta:o tipul fisierului -> se va alege VHDL Module;o numele fisierului;o locatia salvarii fisierului

apoi apasati butonul Next.

Atentie! Casuta Add to project trebuie bifata, altfel riscati ca fisierul sa nu fie adaugat in cadrul proiectului.

Sunteti condusi catre o fereastra in care sunteti interogati cu privire la porturile pe care le veti folosi in program:

o tipul lor: de intrare, de iesire sau de intrare/iesire;o daca sunt sau nu grupate sub forma de vectori;

Page 7: Numarator Binar si BCD cu Controlul Intrarilor

In codul vhdl al numaratorului veti folosi:o 6 porturi de intrare :

clk - reprezinta semnalul de ceas enable – activarea sau dezactivarea numaratorului reset – resetarea numaratorului p- vector binar pe 4 biti ce seteaza numaratorul cu o anumita valoare load – setarea numaratorului cu datele introduse in intrarea p direction - da senusul de numarare: descrescator sau crescator. carry_in - primeste valoarea 1 sau 0 in functie de valoarea digitului precedent.

o 2 porturi de iesire : q - vector binar pe 4 biti ce

returneaza valoarea la care numaratorul a ajuns;

carry_out - returneaza valoarea 1 atunci cand numaratoarea crescatoare a ajuns la valoarea 1 sau numaratoarea descrescatoare a ajuns la valoarea 0 si 0 in rest.

Dand Next apare fereastra in care sunt detaliate proprietatile fisierului vhdl;

Page 8: Numarator Binar si BCD cu Controlul Intrarilor

Apasati Finish si este creat fisierul vhdl in folderul curent al proiectului;Sariti peste fereastrele de adaugare a unui fisier sursa (considerati fisierul creat

acum ca fiind singurul fisier sursa al proiectului) si de analiza a datelor despre proiect;Proiectul este creat si, totodata, fisierul sursa vhdl;Codul sursa propriu-zis va fi scris in zona de architecture;Forma generala a instructiunilor care pot fi utilizate in cadrul limbajului VHDL

pot fi gasite prin accesarea unor Language Templates, printr-un click pe “beculetul magic”.

Un program scris in VHDL se poate delimita in 4 zone:- zona declararii librariilor folosite, asemeni zonei “include” din C/C++;- zona declararii porturilor- zona declararii variabilelor utilizate in program. Aceasta zona este

delimitata de cuvintele cheie entity <nume_fisier> si end <nume_fisier>.

- zona codului sursa unde vor fi scrise instructiunile programului. Aceasta zona este delimitata de cuvintele cheie architecture Behavioral of <nume_fisier> si end Behavioral.

Page 9: Numarator Binar si BCD cu Controlul Intrarilor

Codul sursa al numaratorului binar pe 4 biti modulo 10 este:

library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity count09 is Port ( clk : in STD_LOGIC; reset : in STD_LOGIC; load : in STD_LOGIC; enable : in STD_LOGIC; direction : in STD_LOGIC; carry_in : in STD_LOGIC; p : in STD_LOGIC_VECTOR (3 downto 0); carry_out : out STD_LOGIC; q : out STD_LOGIC_VECTOR (3 downto 0));end count09;

architecture Behavioral of count09 issignal count: STD_LOGIC_VECTOR(3 downto 0):="0000";

beginprocess(clk,reset)begin

if(reset'event and reset='0') thencount<="0000";

elsif(clk'event and clk='1') thenif(load='1') then

if(p>"1001") thencount<="1001";

elsecount<=p;

end if;elsif(enable='1' and carry_in='1') then

if(direction='1') thenif(count="1001") then

count<="0000";else

count<=count+1;end if;

elsif(direction='0') thenif(count="0000") thencount<="1001";

elsecount<=count-1;

end if;end if;

end if;end if;

end process;carry_out<='1' when ((count="0000"and direction='0') or(count ="1001" and direction='1')) else '0';q<=count;end Behavioral;

Dupa ce ati scris codul de mai sus in fisierul count09.vhdl trebuie sa verificati daca aveti erori de sintaxa. Pentru aceasta va duceti in fereastra Sources si selectati fisierul count09.vhdl, apoi in fereastra Process expandati Synthesize-XST si faceti dublu click pe Check Syntax. Pentru a vedea daca ati scris corect codul din punct de vedere sintactic va duceti in fereastra Trancript si selectati Console.

Page 10: Numarator Binar si BCD cu Controlul Intrarilor

3. Realizarea simularii

Pentru a realiza o simulare, procedati in mod asemanator crearii unui fisier VHDL. Astfel, reveniti la tab-ul Sources, unde veti regasi proiectul si fisierul VHDL Module, create mai sus. Selectati proiectul si, dand click dreapta pe acesta, va aparea un meniu din care alegeti optiunea New source… .

Fereastra aparuta este identica cu aceea aparuta mai devreme, la realizarea fisierului sursa pentru fisierul VHDL. De data acesta nu veti alege tipul VHDL Module, ci veti alege tipul Test Bench Waveform, acesta fiind tipul fisierului necesar simularii codului realizat.

In continuare, se va proceda in mod asemanator ca la crearea fisierului VHDL:- se va denumi fisierului in zona File name, cu numele

count09_tbh.tbw;- se va alege locatia de salvare a fisierului in zona Location;- bifati (daca nu este deja bifat) casuta Add to project, pentru ca fisierul

sa fie adaugat proiectului.

Page 11: Numarator Binar si BCD cu Controlul Intrarilor

Dand Next, sunteti interogat care fisier sursa doriti sa-l simulati. Deoarece aveti creat un singur fisier sursa, acesta va fi selectat implicit ca fisier suport al simularii. In cazul prezentei mai multor fisiere sursa, veti selecta doar fisierul pe baza caruia doriti sa creati simularea.

Page 12: Numarator Binar si BCD cu Controlul Intrarilor

Next -> fereastra care apare ne prezinta date despre fisierul pregatit pentru realizarea simularii -> Finish.

Pentru a testa toate functionalitatile numaratorului setati durata simularii de la 1000ns la 50000ns. Apasati Finish.

Sunteti condus automat catre fereastra de modelare a semnalelor de intrare pentru testarea modelului. In dreptul fiecarei intrari, direction, enable, load, reset, p[7:0], exista zona semnalelor de intrare.

Aceste semnale pot fi modelate prin simpla apasare in zona dreptunghiurilor albastre aflate la o distanta de 100ns unul de celalalt. Printr-un click pe aceasta zona, valoarea semnalului va fi modificata la 1 logic sau HIGH. Dand click inca o data pe aceeasi zona, semnalul va reveni la valoarea initiala de 0 logic sau LOW.

Pentru a putea vizualiza mai bine semnalul de ceas apasati click dreapa pe schema de simulare si selectati zoom in de doua ori.

Doarece acesta este un numarator simplu pe 4 biti (1 digit) setati portul carry_in cu valoarea 1 pe intreg parcursul simularii. Celelalte porturi de intrare le puteti seta cum doriti sau asa cum rezulta din imaginea urmatoare:

Page 13: Numarator Binar si BCD cu Controlul Intrarilor

Salvati fisierul testbench, apoi reveniti la tab-ul Sources, unde selectati Behavioral Simulation in loc de Implementation, pentru a vedea fiserul de testare creat si pentru a-l putea simula.

Simularea va avea loc in mediul ModelSim-XE, mediu pe care il veti alege din fereastra Process aflata sub fereastra Sources.

Page 14: Numarator Binar si BCD cu Controlul Intrarilor

Avand selectat fisierul de testbench, selectati optiunea Simulate Behavioral Model. Are loc automat deschiderea mediului ModelSim, precum si compilarea fisierului dumneavoastra, testarea de erori si simularea acestuia.

Fereastra aparuta va prezinta datele simularii, insa pe o perioada mai lunga de timp, astfel ca nu se poate observa direct rezultatul actiunii schemei. Din aceasta cauza, veti selecta butonul Run all, pentru ca simularea sa nu se opreasca intr-un anumit punct al axei timpului, apoi veti da click dreapta pe gaficul aparut, de unde vom selecta optiunea Zoom Range, iar in fereastra aparuta veti introduce intervalul de timp care va intereseaza in vederea analizei simularii, si anume:

- start point = 0 ps;- end point = 10000 ns.

In urma selectiei acestui interval, veti obtine un grafic mult mai clar asupra modului in care a decurs simularea.

Pentru a urmarii mai usor toate functionalitatile numaratorului faceti un click pe undock, iar pe intarea p si iesirea q faceti un click dreapta apoi selectati Radix->Unsigned. Puteti, de altfel, insera un divizor (divider) intre porturile de intrare si cele de iesire facand click dreapta pe zona unde acestea se afla si selectand Insert Divider. De asemeanea puteti modifica culorile semnalelor facand click dreapta pe un anumit port si selectand optiunea Properties… .

Din figura urmatoare puteti observa faptul ca numaratorul pe 4 biti indeplineste toate

Page 15: Numarator Binar si BCD cu Controlul Intrarilor

cerintele laboratorului, si anume : resetare (reset) asincrona pe front descrescator (active-LOW aynchronous), incarcare (load) sincrona pe front crescator, activare (enable) a numaratorului pe front crescator, si directionarea (direction) numaratorului ce face ca circuitul sa numere crescator pentru DIRECTION=1 si descrescator pentru DIRECTION=0.

Din imaginea urmatoare se observa ca resetarea este activa pe front descrescator:

Pentru a realiza numaratorul BCD pe 2 digiti aveti nevoie de 2 numaratoare pe 4 biti ca in figura urmatoare:

Page 16: Numarator Binar si BCD cu Controlul Intrarilor

Asa cum am precizat mai sus portul carry_in al primului numarator va fii mereu 1 iar pentru al doilea numarator carry_in va avea valoarea lui carry_out al primului.

Acum creati un nou fisier VHDL asa cum ati procedat la crearea fisierului count09.vhdl si numiti-l ct2bcd.vhdl. Ca porturi de intrare introduceti CLK, RESET, LOAD, ENABLE, DIRECTION, UNITATI_IN[3:0], ZECI_IN[3:0], iar ca porturi variabile de iesire UNITATI_OUT[3:0], ZECI_OUT[3:0].

Trebuie sa mapati fisierul count09.vhdl in fierul nou creat. Pentru aceasta selectati Implementation din fereastra Sources, apoi selectati fisierul count09. Expandati Design Utilities din fereastra Processes apoi dati dublu click pe View HDL Instantiation Template.

Page 17: Numarator Binar si BCD cu Controlul Intrarilor

Pentru a defini componenta count09, trebuie sa copiati codul ce a aparut in secventa precedenta de la COMPONENT count09 pana la END COMPONENT in fisierul ct2bcd.vhdl in zona de declarare a variabilelor (intre architecture Behavioral of ct2bcd is si begin).

Definiti o variabila signal, CARRY, ce va conecta portul numaratorului unitatilor , carry_out, cu portul carry_in al numaratorului zecilor.

Mai departe trebuie sa instantiati de doua ori label-ul count09. Pentru aceasta va intoarceti la fisierul count09.vhi (creat in urma executarii View HDL Instantiation Template asupra fisierului count09.vhdl) si copiati de 2 ori tot de la Inst_count09: count09 PORT MAP pana jos, in fisierul ct2bcd.vhdl intre begin si end Behavioral; .

Page 18: Numarator Binar si BCD cu Controlul Intrarilor

Redenumiti label-urile celor doua instantieri din Inst_count09 in Inst_count09_unitati si Inst_count09_zeci. Apoi trebuie sa conectati porturile celor doua label-uri la porturile numaratorului BCD astfel:

pentru Inst_count09_unitati : clk => CLK, reset => RESET, load => LOAD, enable => ENABLE, carry_in =>'1',(pentru numaratorul unitatilor

carry_in va fii mereu ‘1’) direction => DIRECTION, p => UNITATI_IN, q =>UNITATI_OUT, carry_out => carry

pentru Inst_count09_zeci : clk => CLK, reset => RESET, load => LOAD, enable => ENABLE, carry_in => CARRY,

Page 19: Numarator Binar si BCD cu Controlul Intrarilor

direction => DIRECTION, p => ZECI_IN q => ZECI_OUT --carry_out=>(portul carry_out al numaratorului

zecilor nu va fii conectat nicaieri.Acesta ar trebui conectat la un alt numarator care ar reprezenta ordinul sutelor).

Codul VHDL pentru numaratorul BCD, ct2bcd.vhdl, este urmatorul:

library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity ct2bcd is Port ( CLK : in STD_LOGIC; RESET : in STD_LOGIC; LOAD : in STD_LOGIC; ENABLE : in STD_LOGIC; DIRECTION : in STD_LOGIC; UNITATI_IN : in STD_LOGIC_VECTOR (3 downto 0); ZECI_IN : in STD_LOGIC_VECTOR (3 downto 0); UNITATI_OUT : out STD_LOGIC_VECTOR (3 downto 0); ZECI_OUT : out STD_LOGIC_VECTOR (3 downto 0)); end ct2bcd;

Page 20: Numarator Binar si BCD cu Controlul Intrarilor

architecture Behavioral of ct2bcd is

COMPONENT count09PORT(

clk : IN std_logic;reset : IN std_logic;load : IN std_logic;enable : IN std_logic;carry_in : IN std_logic;direction : IN std_logic;p : IN std_logic_vector(3 downto 0); q : OUT std_logic_vector(3 downto 0);carry_out : OUT std_logic);

END COMPONENT;

signal CARRY: std_logic;

beginInst_count09_unitati: count09 PORT MAP(

clk =>CLK,reset => RESET,load => LOAD,enable => ENABLE,carry_in =>'1',direction => DIRECTION,p => P(3 downto 0),q => unitati,carry_out => CARRY

);Inst_count09_zeci: count09 PORT MAP(

clk => CLK,reset => RESET,load => LOAD,enable => ENABLE,carry_in => CARRY,direction => DIRECTION,p => P(7 downto 4),q => zeci--carry_out =>

);

end Behavioral;

Nu uitati sa verificati daca sintaxa folosita este corecta, folosind aceleasi instructiuni ca la fisierul count09.vhdl (Check Syntax).

Pentru a simula modelul creati un fisier de testare cu numele ct2bcd_tbh.tbw, urmand instructiunile prezentate la numaratorul pe 4 biti modulo 10. La fel setati durata simularii de la 1000ns la 50000ns. Dupa ce ati creat fisierul testbench setati porturile de intrare astfel incat sa poata fi verificate functionalitatile cerute.

Page 21: Numarator Binar si BCD cu Controlul Intrarilor

Porniti simularea in ModelSim XE si verificati daca numaratorul creat indeplineste functionalitatile cerute : resetare asincrona pe front descrescator, incarcare sincrona pe front crescator, activarea numaratorului pe front crescator, si directionarea numaratoruluiin functie de valoarea variabilei DIRECTION. Numaratorul trebuie sa numere de la 00 la 09, apoi de la 10 la 19 pana cand ajunge la 99. In acest moment numaratorul o va lua de la capat cu valoarea 00. Intrarile binare paralele trebuie sa incarce orice valoare de la 0 la 9. Daca intrarile binare paralele nu sunt valabile pentru numarator (valoarea lor este intre “1010” si “1111”) pe fiecare digit se va afisa valoarea 9.

Pozitia start a simularii

Se verifica functia enable, si direction (numarare crescatoare sau descrescatoare):

Se verifica daca functia reset este activa pe front descrescator si daca numaratorul, fiind pe pozitia 00, se intoarce la 99 prin numaratoare descerscatoare (DIRECTION=0) :

Page 22: Numarator Binar si BCD cu Controlul Intrarilor

Se verifica functia load si functia reset (daca reset are prioritate fata de load, iar load fata de enable):

Numaratorul binar pe 8 biti

Pentru a realiza un numarator binar pe 8 biti, modulo 100 (va numara de la 00 la 99), in cadrul aceluiasi proiect creati un fisier cu numele ct8bit.vhdl. Codul sursa este asemanator numaratorului modulo 10 pe 4 biti. Vom folosi ca porturi de intrare: CLK, RESET, LOAD, ENABLE, DIRECTION, P[7:0], iar ca port de iesire vom folosi un vector binar pe 8 biti, Q[7:0].

Page 23: Numarator Binar si BCD cu Controlul Intrarilor

Vom folosi o variabila de tip vector binar, count, care va numara de la 00 (“00000000”) pana la 99 (“01100011”). Spre depsebire de numaratorul modulo 10, nu vom mai folosi acea variabila CARRY, iar iesirea este un singur vector binar pe 8 biti si nu doi vectori pe 4 biti.

Codul VHDL pentru numaratorul binar pe 8 biti este:

library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity ct8bit is Port ( CLK : in STD_LOGIC; RESET : in STD_LOGIC; LOAD : in STD_LOGIC; ENABLE : in STD_LOGIC; DIRECTION : in STD_LOGIC; P : in STD_LOGIC_VECTOR (7 downto 0); Q : out STD_LOGIC_VECTOR (7 downto 0));end ct8bit;architecture Behavioral of ct8bit is

signal count: STD_LOGIC_VECTOR (7 downto 0):="00000000";beginprocess(clk,reset)

beginif(reset'event and reset='0') then

Page 24: Numarator Binar si BCD cu Controlul Intrarilor

count<="00000000";elsif(CLK'event and CLK='1') then

if(load='1') thenif(P>"01100011") then

count<="01100011";else

count<=P;end if;

elsif(ENABLE='1') thenif(DIRECTION='1') then

if(count="01100011") thencount<="00000000";

elsecount<=count+1;

end if;elsif(DIRECTION='0') then

if(count="00000000") thencount<="01100011";

elsecount<=count-1;

end if;end if;

end if;end if;

end process;Q<=count;

end Behavioral;

Copiati codul in fisierul VHDL creat, ct8bit.vhdl, si verificatii sintaxa (Check Syntax).

Dupa ce ati verificat daca ati folosit corect sintaxa puteti simula numaratorul binar.Creati un fisier Test Bench Waveform cu numele ct8bit_tbh.tbw cu aceleasi setari

ca ct2bcd_tbh.tbw.

Page 25: Numarator Binar si BCD cu Controlul Intrarilor

Setati valorile porturilor de intrare astfel incat sa fie verificate toate functionalitatile numaratorului binar pe 8 biti.

Lansati simularea pentru acest fisier si verificati daca numaratorul functioneaza corect.

Se observa ca functia enable este sincrona, activa pe front crescator.De asemena si functia direction este activa pe front crescator.

Se observa ca functia load este sincrona pe front crescator, iar functia reset este asincrona si active pe front descrescator, avand prioritate fata de load:

Exercitiu: Folosind cunostintele dobandite in urma parcurgerii acestui laborator,

implementati un multipol logic in VHDL care sa permita afisarea timpului (cronometru digital) : minute si secunde. Ceasul va avea fuctii de resetare, setarea timpului, activare (stop/start) si de memorare a timpilor.