Sunteți pe pagina 1din 17

PROIECT PENTRU DISCIPLINA

PROIECTAREA SISTEMELOR NUMERICE

Titlul lucrării:

AGENDĂ DE BIROU

2021
CUPRINS

1. Cerința proiectului
2. Cutia neagră
3. Proiectare și componete
4. Implementarea în Active-HDL
4.1 Memoria RAM
4.1.1 Entitatea
4.1.2 Arhitectura
4.2Agenda
4.2.1 Entitatea
4.2.2 Arhitectura
5. Interfața cu exteriorul I/O
6. Justificarea soluției alese
7. Instrucțiuni de utilizare
8. Posibilități de dezvoltare ulterioară
9. Bibliografie

2021
1. CERINȚA PROIECTULUI

Să se proiecteze o agendă de birou care să afișeze secunda, minutul, ora, ziua, luna, anul și
temperatura ambientală în grade Celsius. De asemenea, agenda va fi prevazută cu o alarmă
asociată unei anumite ore și minut.

2. CUTIA NEAGRĂ

2021
3. PROIECTARE ȘI COMPONENTE

Cu scopul de a determina pe ieșiri secunde, minute, ore, zile, luni și ani este nevoie de un
generator de ceas care va număra frontul ascendent al intrării CLK a agendei (va aduna 1
la fiecare front ascendent). Se cunoaște și se va folosi faptul că 1000000000 ns este
echivalentul unei secunde. În momentul în care s-a atins valoarea respectivă avem 1 s.
Mai departe, se vor număra secunde cu scopul de a determina minute. La 60 de secunde
se va număra 1 minut iar contorul pentru secunde va porni de la 0 din nou. În același fel
se întâmplă și cu minutele ( 60 minute=1 ora, când se ajunge la 60 minutele încep din nou
de la 0 ), orele ( 24 ore =1 zi, când se ajunge la 24 orele încep din nou de la 0), zilele ( 30
zile=1 lună, când se ajunge la 30 zilele se resetează la 1) și lunile (12 luni=1 an, valoarea
la care se va reseta fiind 1). Valoarea maximă pentru ani am ales să fie 2500, valoarea de
reset fiind 2000.
În ceea ce privește temperatura ambientală, aceasta va fi extrasă dintr-o memorie RAM
(de 24 ) care stochează temperatura în grade Celsius la fiecare oră din zi.
Alarma asociată orei și minutului este un semnal care se va activa (va avea valoarea 1)
când se detectează minutul ALARMA_MINUT (intrare) și respectiv ora
ALARMA_ORA (intrare).
Agenda este prevăzută cu o intrare de reset (RST) care în momentul în care este activată
cu 1 aduce agenda în starea sa inițială, adică secundele, minutele și orele la valoarea 0,
zilele și lunile la valoarea 1, respectiv anul la valoarea 2000.

2021
4. IMPLEMENAREA ÎN ACTIVE-HDL
Menționez că librăriile folosite în cadrul proiectului sunt library ieee, ieee.std_logic_1164.all,
IEEE.STD_LOGIC_ARITH.ALL, IEEE.STD_LOGIC_UNSIGNED.ALL.

4.1MEMORIA RAM

4.1.1 ENTITATEA

entity MEMORIE_ROM_TEMPERATURA is
port (
A_ROM: in integer range 0 to 23;
CS_ROM: in bit;
D_ROM: out integer
);
end MEMORIE_ROM_TEMPERATURA;

Intrarea memoriei ROM (A_ROM) este un întreg care poate lua valori între 0 și 23,
valori corespunzătoare orei. CS_ROM este intrarea de activare iar D_ROM ieșirea care
corespunde temperaturii în grade Celsius la o anumită oră.

4.1.2 ARHITECTURA

architecture temperatura_pe_ora of MEMORIE_ROM_TEMPERATURA is


begin
process(CS_ROM, A_ROM)
begin
if (CS_ROM = '1') then
case(A_ROM) is
when 0 => D_ROM <= 5;
when 1 => D_ROM <= 4;
when 2 => D_ROM <= 3;
when 3 => D_ROM <= 3;

when 4 => D_ROM <= 4;


when 5 => D_ROM <= 4;

2021
when 6 => D_ROM <= 6;
when 7 => D_ROM <= 8;

when 8 => D_ROM <= 9;


when 9 => D_ROM <= 9;
when 10 => D_ROM <= 10;
when 11 => D_ROM <= 10;

when 12 => D_ROM <= 10;


when 13 => D_ROM <= 11;
when 14 => D_ROM <= 12;
when 15 => D_ROM <= 14;

when 16 => D_ROM <= 15;


when 17 => D_ROM <= 16;
when 18 => D_ROM <= 15;
when 19 => D_ROM <= 14;

when 20 => D_ROM <= 10;


when 21 => D_ROM <= 10;
when 22 => D_ROM <= 9;
when 23 => D_ROM <= 8;
end case;
else
D_ROM <= 0;
end if;
end process;

end temperatura_pe_ora;

Memoria este implementată în cadrul unu process, cu ajutorul instrucțiunii case. Se


tratează fiecare valoare pe care o poate lua intrarea A_ROM, și anume toate orele din zi,
de la 0 la 23. Pentru toate aceste valori I se atribuie ieșirii D_ROM un anumit număr
întreg care reprezintă temperatura. În cazul în care nu este activate memoria
(CS_ROM=0) se va atribui valoarea 0 ieșirii. Cu toate acestea, CS_ROM este folosit în
cazul agendei de birou doar cu valoarea 1 deoarece se dorește afișarea temperaturii la
toate orele din zi.

2021
4.2AGENDA
4.2.1 ENTITATEA
entity agenda is
port(
CLK: in bit;
RST: in bit;
ALARMA_ORA: in integer range 0 to 23;
ALARMA_MINUT: in integer range 0 to 59;
an: out std_logic_vector (11 downto 0);
luna: out std_logic_vector (3 downto 0);
ziua: out std_logic_vector (4 downto 0);
ora: out std_logic_vector(4 downto 0);
minut: out std_logic_vector (5 downto 0);
secunda: out std_logic_vector (5 downto 0);
temperatura: out integer;
ALARMA: out bit
);
end agenda;

Agenda are ca intrări CLK (intrarea de tact), RST (intrarea de reset, activă pe 1), ALARMA_ORA
și ALARMA_MINUT (intrări de tip întreg între 0 și 23 respectiv 0 și 59, numere reprezentând ora
și minutul la care se dorește activarea alarmei). Ieșirile an, luna, ziua, ora, minut și secunda sunt
de tipul STD_LOGIC_VECTOR având lungime vectorului în funcție de întregul cel mai mare
transformat în binar (2500 în binar este un șir de lungime 12, 30 în binar este un șir de lungime 4
etc). Ieșirea temperatura este un întreg care va lua valori la fiecare oră din memoria RAM
definită anterior. ALARMA se activează în momentul în care ora și minutul detectat este egal cu
ieșirile ALARMA_ORA și ALARMA_MINUT.

2021
4.2.2 ARHITECTURA
Voi începe prezentarea arhitecturii agendei prin explicarea părții de declarații din cadrul
acesteia, respective componenta și semnalele intermediare.

component MEMORIE_ROM_TEMPERATURA is
port (
A_ROM: in integer range 0 to 23;
CS_ROM: in bit;
D_ROM: out integer
);
end component;

signal sec_t, min_t: integer range 0 to 59;


signal ora_t : integer range 0 to 23;
signal ziua_t: integer range 1 to 30;
signal luna_t: integer range 1 to 12;
signal an_t: integer range 2000 to 2500;
signal count : integer := 1;
signal clk_start : std_logic := '1';
Semnalele declarate în cadrul arhitecturii sec_t, min_t, ora_t, ziua_t, luna_t, an_t au
rolul de a număra (între valorile definite cu range… to...) în cadrul celui de al doilea
process. Aceste valori întregi vor fi convertite la final în tipul STD_LOGIC_VECTOR
pentru a se potrivi ieșirilor corespunzătoare. Semnalul count are rolul de a număra până
la 100000000 ns (frontal ascendent al intrării de tact CLK) în scopul de a detecta 1
secunda. Semnalul clk_start este cel al cărui front ascendent îl vom urmări pentru a
număra secundendele și în continuare minutele, orele, zilele, lunile și anii.

2021
Arhitectura agendei este alcătuite din 2 procese, fiecare având un scop bine definit și
folosind semnalele anterioare

Primul process- Generatorul de ceas


clock_start_generation : process (CLK)
begin
if (CLK'EVENT and CLK ='1') then
count <= count + 1;
if (count = 50000000) then
clk_start <= not clk_start;
count <= 1;
end if;
end if;
end process;

În cadrul acestui process este generat practic un nou semnal de tact și anume clk_start.
Acesta în momentul declarării sale în cadrul arhitecturii ia valoarea 1. Când intrarea
agendei CLK este pe frontul ascendent, contorul count se incrementează. Dacă s-a
ajuns cu contorul la 50000000 clk_start va lua valoarea s-a opusă (dacă era 0 va
deveni 1 și invers) iar contorul count va reîncepe numărătoarea de la 1. Valoarea de
50000000 a fost aleasă deoarece simularea va rula cu intrarea CLK la o
frecvență de 100 MHz deci o durată de 10 ns între fronturile ascendente, motiv
pentru care ar trebui să se numere până la 100000000 (100000000*10 ns=1 s).
Deoarece în procesul al doilea se numără secunda în momentul detectării frontului
ascendent al clk_start valoarea acestui semnal trebuie schimbată de 2 ori ( din 1 în 0 o
data la 50000000 ns și încă o data din 0 în 1 tot la 50000000 ns pentru a
genera un front ascendent pe clk_start).

2021
Al doilea process
process (clk_start, RST)
begin
if (RST ='0') then
if (rising_edge(clk_start)) then
if (sec_t = 59) then
sec_t <= 0;
if (min_t = 59) then
min_t <= 0;
if (ora_t = 23) then
ora_t <= 0;
if(ziua_t = 30) then
ziua_t <= 1;
if(luna_t = 12) then
luna_t <= 1;
if(an_t=2500) then
an_t <= 2000;
else
an_t <= an_t+1;
end if;
else
luna_t <= luna_t+1;
end if;
else
ziua_t <= ziua_t + 1;
end if;

2021
else
ora_t <= ora_t + 1;
end if;
else
min_t <= min_t + 1;
end if;
else
sec_t <= sec_t + 1;
end if;
end if;

else
sec_t <= 0;
min_t <= 0;
ora_t <= 0;
ziua_t <= 1;
luna_t <= 1;
an_t <= 2000;
end if;

if(ora_t=ALARMA_ORA and min_t=ALARMA_MINUT) then


ALARMA<='1';
else
ALARMA<='0';
end if;
end process;
În cadrul acestui process se determină valoriile pentru ieșiri. Astfel, când RST este
activat (RST=1) secundele, minutele, orele, zilele, lunile si anii se resetează la valorile
lor inițiale precizate anterior (semnale lor corespunzătoare iau aceste valori). În cazul în

2021
care RST are valoarea 0 și este detectat un front ascendent al semnalului clk_start (1
secundă)

semnalele se incrementează corespunzător. De exemplu sec_t se incrementează cu 1


dacă nu a ajuns la 59 iar daca a atins această valoare se va incrementa min_t care la
rândul său dacă a atins valoarea 59 va determina incrementarea semnalului ora_t și așa
mai departe. Când valorile maxime sunt atinse, pe lângă declanșarea incrementării
semnalului următor, semnalul ia valoarea de reset corespunzătoare fără a fi nevoie de
activarea intrării RST.
ALARMA este activată (ia valoarea 1) în cazul în care semnale ora_t și minut_t (deci
ora si minutul current) sunt egale simultan cu intrările agendei ALARMA_ORA
respectiv ALARMA_MINUT.

Atribuiri finale
c1: MEMORIE_ROM_TEMPERATURA port map(ora_t, '1', temperatura);
secunda <= conv_std_logic_vector(sec_t, 6);
minut <= conv_std_logic_vector(min_t, 6);
ora <= conv_std_logic_vector(ora_t, 5);
ziua <= conv_std_logic_vector(ziua_t, 5);
luna <= conv_std_logic_vector(luna_t, 4);
an <= conv_std_logic_vector(an_t, 12);

La finalul arhitecturii se atribuie ieșirilor valorile determinate în cadrul procesului.


Astfel, cu ajutorul instrucțiunii port map și componentei declarate anterior, ieșirea
temperatura va lua valoarea corespunzătoare orei curente (ora_t) din memoria RAM
definită anterior. Restul ieșirilor (secunda, inut, ora, ziua, luna și an) vor lua valorile
rezultate conversiilor întregilor corespunzători semnalelor sec_t, min_t, ora_t, ziua_t,
luna_t și an_t în tipul STD_LOGIC_VECTOR. Această conversie este realizată cu
ajutorul funcției predefinte conv_std_logic_vector care are parametrii întregul pe care îl
doresc convertit și lungimea șirului.

2021
5. INTERFAȚA CU EXTERIORUL I/O

INTRĂRI (I)

 CLK – intrarea de tact a agendei, este un semnal in de tip BIT


 RST- intrarea de reset, aduce datele în starea inițială când este activată, este un
semnal in de tip BIT
 ALARMA_ORA- indică ora la care se dorește activarea alarmei, semnal in de tip
integer
 ALARMA_MINUT- indică minutul la care se dorește activarea alarmei, semnal
in de tip integer

IEȘIRI (O)
 an- semnal out de tip STD_LOGIC_VECTOR cu lungimea 12
 luna- semnal out de tip STD_LOGIC_VECTOR cu lungimea 4
 ziua- semnal out de tip STD_LOGIC_VECTOR cu lungimea 5
 ora- semnal out de tip STD_LOGIC_VECTOR cu lungimea 5
 minutul- semnal out de tip STD_LOGIC_VECTOR cu lungimea 6
 secunda- semnal out de tip STD_LOGIC_VECTOR cu lungimea 6
 temperatura- semnal out de tip integer
 ALARMA- semnal out de tip BIT, are valoarea 1 când ora și minutul sunt egale
cu valorile date pe intrările ALARMA_ORA respectiv ALARMA_MINUT și
valoarea în caz contrar.

2021
6. JUSTIFICAREA SOLUȚIEI ALESE

Am ales să implementez acest proiect în modul prezentat anterior deoarece sunt de părere
că este o metodă cât se poate de simplă și logică în care este descrisă funcționarea unei
agende de birou de tipul celei cerute. Memoria RAM folosită facilitează într-un mod
elegant extragerea datelor dorite și determinarea temperaturii. Generatorul de ceas
detectează secunda prin schimbările produse pe semnalul clk_start formând fronturile
necesare. După detectarea secundei totul ține de incrementarea în cascadă a tuturor
semnalelor intermediare folosite în modul descries anterior.

7. INSTRUCȚIUNI DE UTILIZARE

Agenda se folosește în Active-HDL astfel:


1. Se deschide programul Active-HDL
2. Se compilează cu ajutorul comenzii “Compile”
3. Cu ajutorul “New waveform” se simulează proiectul
4. Se adaugă din listă toate intrările, ieșirile și optional semnalele intermediare
5. Se dau valori intrărilor făcând click dreapta pe lista apărută și selectând “Simulators”.
Tot de acolo se alege ,,Clock” pentru intrarea CLK a proiectului și se setează frecveța
la 100 MHz. Se poate alege și ,,Hotkey” pentru intrarea RST cu scopul de a schimba
mai ușor de la tastatură valoarea acestui semnal.

2021
6. Se apasă butonul “Run for” din meniu și se urmăresc rezulatele opținute pe ieșiri.

8. POSIBILITĂȚI DE DEZVOLTARE ULTERIOARĂ

Agenda de birou pe care am realizat-o este una care permite doar resetarea datelor la valoriile
inițiale. Acest lucru este realizat în momentul în care se activează intrarea RST.
Pentru a dezvolta proiectul este posibil adăugarea unei opțiuni de setare a secundei, minutului,
orei, zilei, lunii și anului la anumite valori date de utilizator.
Această îmbunătățire constă în modificarea entității agendei astefl încât să avem o intrare SET
care atunci când este activată să determine agenda să atribuie valorile date de utilizator. Sunt
necesare de asemenea și alte 6 intrări pentru a oferi posibilitatea de introducere de date. Se poate
adăuga și o opțiune de resetare la valorile introduse de utilizator. Acesta ar fi cazul în care
intrarea RST ar fi activă în același timp cu intrarea SET (asta pentru a crea o prioritate în
momentul în care sunt active ambele intrări).
Se mai pot adăuga multiple alarme asociate chiar cu data (ziua, luna, anul), un fel de marcare de
eveniment. Pentru această opțiune este nevoie de modificarea entității astfel încât să se ofere
utilizatorului posibilitatea să adauge data evenimentului pentru care dorește alarma dar și încă o
ieșire care să marcheze detectarea datei respective.

2021
9. BIBLIOGRAFIE

Cursul Proiectarea Sitemelor Numerice


https://vhdlguru.blogspot.com/2010/03/digital-clock-in-vhdl.html
https://stackoverflow.com/questions/6116054/implementing-a-digital-clock-in-vhdl
https://www.nandland.com/vhdl/tips/tip-convert-numeric-std-logic-vector-to-integer.html

2021
2021

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