Sunteți pe pagina 1din 25

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/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

Echipament Placa FPGA de testare Spartan 3


necesar Xilinx ISE 10.1 software + ModelSim XE III 6.3c
Adaptor AC, iesire minima: 7 VDC, 250 mA DC
Manseta antistatica
Fire cu miez solid
Cleste 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)).
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
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.3c
Salvati 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 (poate
numă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.
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.
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.
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;
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;
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.
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 is


signal count: STD_LOGIC_VECTOR(3 downto 0):="0000";
begin
process(clk,reset)
begin
if(reset'event and reset='0') then
count<="0000";
elsif(clk'event and clk='1') then
if(load='1') then
if(p>"1001") then
count<="1001";
else
count<=p;
end if;
elsif(enable='1' and carry_in='1') then
if(direction='1') then
if(count="1001") then
count<="0000";
else
count<=count+1;
end if;

elsif(direction='0') then
if(count="0000") then
count<="1001";
else
count<=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.
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.
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.
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:
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.
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
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:
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.
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; .
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,
 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;
architecture Behavioral of ct2bcd is

COMPONENT count09
PORT(
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;

begin
Inst_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.
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) :
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].
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";
begin
process(clk,reset)
begin
if(reset'event and reset='0') then
count<="00000000";
elsif(CLK'event and CLK='1') then
if(load='1') then
if(P>"01100011") then
count<="01100011";
else
count<=P;
end if;
elsif(ENABLE='1') then
if(DIRECTION='1') then
if(count="01100011") then
count<="00000000";
else
count<=count+1;
end if;
elsif(DIRECTION='0') then
if(count="00000000") then
count<="01100011";
else
count<=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.
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.

S-ar putea să vă placă și