You are on page 1of 17

Universitatea Tehnica Cluj-Napoca Facultatea de Automatica si Calculatoare An:2011-2012

Automat Bancar

Student:Veja Alina-Andreea

Grupa:30215

CUPRINS

1. Specificatia proiectului 2. Schema bloc cu explicatii 3. Componente 4. Justificarea solutiei alese 5. Instructiuni de utilizare 6. Posibilitati de dezvoltare ulterioara

1. SPECIFICATIA PROIECTULUI

Sa se proiecteze un automat bancar pentru extrageri de sume in EURO. Se presupune ca suma maxima care poate fi extrasa o data este de maximum 1.000 EURO. Operatiile efectuate initial sunt de identificare a cardului i alegere a operatiei. In cazul cererii de eliberare de numerar se introduce suma, se verifica existenta sumei cerute i se actualizeaza contul. Apoi se elibereaza cardul, suma si, eventual, chitanta.

2.SCHEMA BLOC CU EXPLICATII


Avem intrarile: - Vectorul de 4 biti prin care se specifica adresa contului pe care se vor efectua operatii; - Vectorul de 16 biti pe care se introduce suma care se doreste a fi extrasa; - Un tact universal prin care se sincronizeaza componentele; - 12 biti pentru inroducerea PIN-ului; - O intrare pentru alegerea operatei; - O intrare pentru confirmarea chitantei; Componentele principale: - Identificator de card - Memorie ROM in care sunt retinute codurile PIN - Comparator pe 12 biti pentru codul PIN - Alegerea operatiei - Comparator intre suma dorita si 1000 - Memorie RAM pentru solduri - Comparator intre sold si suma dorita - Scazator pentru obtinerea noului sold dupa extragere - Unitate pentru eliberarea cardului

3.COMPONENTE
1.Identificator de card transforma vectorul de 4 biti ADR intrun intreg care va fi adresa din memoriile RAM(in care se retine soldul clientului) si ROM(contine codul PIN al fiecarui client). library IEEE; use IEEE.STD_LOGIC_1164.all; entity IDN_CARD is port(ADR: in STD_LOGIC_VECTOR(3 downto 0); ADR_INDEX: out INTEGER range 0 to 15; CLK: in STD_LOGIC); end IDN_CARD; architecture ARH of IDN_CARD is begin PROCES: process(CLK) variable nr_cont: INTEGER; begin nr_cont:=0; if CLK'EVENT AND CLK = '1' then if ADR = "0000" then nr_cont := 0; elsif ADR = "0001" then nr_cont:= 1; elsif ADR = "0010" then nr_cont:= 2; elsif ADR = "0011" then nr_cont:= 3; elsif ADR = "0100" then nr_cont:= 4; elsif ADR = "0101" then nr_cont:= 5; elsif ADR = "0110" then nr_cont := 6; elsif ADR = "0111" then nr_cont:= 7; elsif ADR = "1000" then nr_cont:= 8; elsif ADR = "1001" then nr_cont:= 9; elsif ADR = "1010" then nr_cont:= 10; elsif ADR = "1011" then nr_cont:= 11; elsif ADR = "1100" then nr_cont:= 12; elsif ADR = "1101" then nr_cont:= 13; elsif ADR = "1110" then nr_cont:= 14; elsif ADR = "1111" then nr_cont:= 15; end if; end if; ADR_INDEX <= nr_cont; end process PROCES; end ARH; 6

2. . Memoria ROM in care sunt retinute codurile PIN ale cilentilor aceasta componenta retine cei 12 biti ai codului PIN. Pe intrarea ADRS de tip intreg se introduce adresa din memorie in care este retinut codul PIN, iar in vectorul de 12 biti de iesire se va incarca continutul memoriei care va fi transmis spre comparatorul pe 12 biti.

library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.NUMERIC_STD.all; entity MROM_PIN is port(ADRS: in INTEGER range 0 to 15; DATA: inout STD_LOGIC_VECTOR(11 downto 0)); end MROM_PIN; architecture ARH of MROM_PIN is type VECTOR_ARRAY is array(0 to 15) of STD_LOGIC_VECTOR(11 downto 0); constant MEMORY: VECTOR_ARRAY := ( "011010111001", "101010100110", "100101100101", "001001110101", "010110011101", "100111010110", "000110100101", "101100010110", "000001010011", "010100010110", "010000101001", "000111101001", "001111011000", "100111101001", "100000101010", "110101111011"); begin process(ADRS) begin DATA <= MEMORY(ADDR); end process; end ARH;

3.Comparatorul de PIN-compara PIN-ul introdus de catre utilizator, primit pe vectorul de 12 biti PIN_CITIT, cu PIN-ul transmis de catre memoria ROM a PIN-urilor retinute de catre banca. Aceasta componenta compara in procesul comparare ficare bit din cei doi vectori, iar atunci cand se compara biti cu valori diferite, semnalul intermediar ok, care initial are valoarea logica 1, va lua valoarea logica 0. In procesul valid se va asigna iesirii PIN_CORECT valoarea semnalului ok, care va fi folosit ca intrare de date in demultiplexorul de alegere a operatiei si in unitatea de eliberare a cardului. library IEEE; use IEEE. STD_LOGIC_1164.all; entity COMPARATOR_PIN12 is port (PIN_MEMORAT:in STD_LOGIC_vector(11 downto 0); PIN_CITIT: in STD_LOGIC_vector (11 downto 0); PIN_CORECT: out STD_LOGIC); end COMPARATOR_12PIN; architecture COMP_12 of COMPARATOR_12PIN is signal ok: STD_LOGIC; begin comparare: process(PIN_MEMORAT, PIN_CITIT) begin ok <= '1'; for i in 11 downto 0 loop if PIN_MEM(i) /= PIN_CITIT(i) then ok <= '0'; end if; end loop; end process comparare; valid: process (ok) begin PIN_OK <= ok; end process; end COMP_12; 4. Alegerea operatiei- se realizeaza cu ajutorul unui demultiplexor care primeste intrarea de date de la iesirea comparatorului de PIN si selectia de la intarea generala OP. In cazul in care OP are: -valoarea logica 1 se va active iesirea pentru eliberarea de numerar (EN);

-valoarea logica 0 se va active iesirea pentru verificarea soldului (VS); Alegerea se face doar in cazul in care PIN_CORECT are valoarea logica 1, adica doar atunci cand pinul introdus este cel corect. library IEEE; use IEEE.STD_LOGIC_1164.all; entity DMUX_OPT is port(OP: in STD_LOGIC; E:in STD_LOGIC; EN, VS: out STD_LOGIC); end DMUX_OPT; architecture DMUX of DMUX_OPT is begin PROC: process(E, OP) begin if E = '1' then VS <= '1' and not OP; EN <= '1' and OP; end if; end process PROC; end DMUX; 4.1 Verificarea soldului-activeaza modul de citire al memoriei ROM in care e retinut soldul current al clientului cu numarul de cont ADRS, iar continutul memoriei se va transmite prin iesirea prin iesirea de 16 biti SOLD la un afisor. library IEEE; use IEEE.STD_LOGIC_1164.all; entity AFIS is port(I: in STD_LOGIC_VECTOR(15 downto 0); O: out STD_LOGIC_VECTOR(15 downto 0)); end AFIS; architecture ARH of AFIS is begin O <= I; end ARH;

4.2. Eliberarea de numerar- este o operatie care se realizeaza cu ajutorul urmatoarelor componente: doua comparatoare si un scazator. Primul comparator compara suma introdusa de utilizator, prin vectorul de 16 biti A, cu intregul 1000, exprimat printr-un vector de 16 biti, adica compara daca suma introdusa este mai mica sau egala cu 1000, numai atunci cand intrarea EN, care este folosita pe post de enable, este 1 logic. Intrarea EN provine din iesirea demultiplexorului de alegere a operatiei. Iesirea INVALID-semnalizeaza corectitudinea sumei dorite (cand este 1 suma introdusa este valida) care va activa cel de-al doilea comparator dintre suma introdusa si soldul current, iar magistrala SUMA va transmite suma introdusa spre al doilea comparator. library IEEE; use IEEE. STD_LOGIC_1164.all; entity COMP_1000 is generic(B: STD_LOGIC_VECTOR(15 downto "0000001111101000"); port(A: in STD_LOGIC_VECTOR(15 downto 0); EN: in STD_LOGIC; CLK: in STD_LOGIC; SUMA: out STD_LOGIC_VECTOR(15 downto 0); INVALID: out STD_LOGIC); end COMP_1000; 0) :=

architecture ARH of COMP_1000 is signal ok, ok1: BIT; begin PROC: process(A, EN, CLK) begin if EN = '1' and CLK'EVENT then ok <= '1'; ok1 <= '0'; for i in 15 downto 0 loop if A(i) = '1' and B(i) = '0' and ok1 = '0' then ok1 <= '1'; else if A(i) = '0' and B(i) = '1' and ok1 = '0' then ok <= '0'; end if; end if; end loop; 10

if ok1 = '1' then INVALID <= '0'; SUMA <= "0000000000000000"; else INVALID <= '1'; SUMA <= A; end if; end if; end process PROC; end ARH; Al doilea comparator verifica daca suma ceruta exista in cont astfel: pe intrarile A si B se primesc suma dorita si soldul curent al clientului sub forma unor vectori de 16 biti pe care le compara,iar in final, in cazul in care vectorul B, care reprezinta suma introdusa este mai mic decat vectorul A se va activa modul de scriere in memoria RAM si se va introduce rezultatul scaderii dintre soldul curent si suma introdusa. library IEEE; use IEEE. STD_LOGIC_1164.all; entity COMP_SUME is port(A: in STD_LOGIC_VECTOR(15 downto 0); B: in STD_LOGIC_VECTOR(15 downto 0); EN: in STD_LOGIC; CLK: in STD_LOGIC; S_OK: out STD_LOGIC_VECTOR(15 downto 0); REP: out STD_LOGIC); end COMP_SUME; architecture ARH of COMP_SUME is signal ok, ok1: BIT; begin PROC: process(A, B, EN, CLK) begin if EN = '0' and CLK'EVENT then ok <= '1'; ok1 <= '0'; for i in 15 downto 0 loop if A(i) = '1' and B(i) = '0' and ok1 = '0' then ok1 <= '1'; else if A(i) = '0' and B(i) = '1' and ok1 = '0' then ok <= '0'; 11

end if; end if; end loop; end if; end process PROC; PR: process(CLK) begin if ok1 = '0' then REP <= '0'; S_OK <= "0000000000000000"; else REP <= '1'; S_OK <= B; end if; end process PR; end ARH; Scazatorul de 16 biti ajuta la calcularea diferentei dintre soldul curent al contului, primit pe intrarea A si suma solicitata, transmisa pe intrarea B. Rezultatul va fi transmis pe iesirea Y care reprezinta intrare pentru memoria RAM in modul de scriere in aceasta. library IEEE; use IEEE. STD_LOGIC_1164.all; use IEEE.NUMERIC_STD.all; entity SCAZATOR is port(A: in STD_LOGIC_VECTOR(15 downto 0); B: in STD_LOGIC_VECTOR(15 downto 0); Y: out STD_LOGIC_VECTOR(15 downto 0)); end SCAZATOR; architecture ARH of SCAZATOR is begin SUBST: process(A, B) begin Y <= STD_LOGIC_VECTOR(unsigned(A) - unsigned(B)); end process SUBST; end ARH;

4. JUSTIFICAREA SOLUTIEI ALESE


12

Am optat pentru acesta solutie deoarece mi s-a parut cea mai usor de implementat si cea mai apropiata de realitate. De asemenea solutia aleasa e usor de inteles deoarece ordinea in care se trece de la o componenta la alta este cat se poate de logica si este eficienta pentru indeplinirea cerintelor clientului. Consider ca este cea mai apropiata de realitate deoarece in viata reala un automat bancar citeste de pe banda magnetica a cardului numarul unic de inregistrare care coincide in acest caz cu vectorul de 4 biti ADR al automatului proiectat de mine. Dupa introducerea corecta a PIN-ului orice automat bancar asteapta ca clientul sa isi aleaga operatia cum ar fi verificarea soldului sau extragerea de numerar. La sfarsitul operatiilor clientul poate opta pentru afisarea pe chitanta a unui scurt rezumat cu ceea ce s-a efectuat in sesiunea curenta.

5. INSTRUCTIUNI DE UTILIZARE
13

La prima vedere acest automat pare destul de complicat, se folosesc multi vectori pe multi biti, intrari de activare a componentelor, semnale intermediare, etc., dar urmand pasii urmatori oricine ar trebui sa se poata descurca cu acesta. 1. se introduce in vectorul ADR echivalentul in binar a adresei cardului dvs. RESTRICTIE: aceasta adresa trebuie sa fie cuprinsa intre 15 si 0.

2. se

actioneaza o singura data tactul general al automatului pentru ca prima componenta, cea de identificare a cardului(IDN_CARD), sa faca conversia adresei binare si sa transmita memoriei ROM in care sunt retinute codurile PIN adresa de la care sa citeasca PIN-ul pentru contul respectiv. 3. se introduce o secventa de 12 biti care reprezinta codul PIN introdus de utilizator si pe care comparatorul pe 12 biti il va compara cu PIN-ul din memoria ROM. 4. se mai actioneaza inca o data tactul principal pentru a executa comparatia, dupa care in cazul in care rezultatul compararii este adevarat se va continua spre alegerea operatiei, altfel se va activa automatul de eliberare de card. 5. in cazul in care PIN-ul este corect pe intrarea OP se va introduce operatia dorita (0 pentru verificare sold si 1 pentru eliberare de numerar): a. daca alegem sa verificam soldul curent, atunci se va actiona tactul general o singura data, iar pe magistrala SOLD_O se va transmite valoarea citita din memoria RAM de la adresa ADR

14

b. in cazul alegerii de extragere numerar va trebui sa

se introduca suma dorita urmata de 3 impulsuri de tact. Fiecare impuls are rolul de a transforma rezultatul compararii in intrare de enable pentru componenta urmatoare din ciclul acestei operatii 6. in functie de operatia aleasa la pasul anterior continuarea este: a. daca s-a ales verificarea soldului atunci utilizatorul va solicita chitanta si va lua cardul, eliberat de automat b. se ridica suma ceruta, cardul si, eventual chitanta, in cazul in care s-a solicitat si tiparirea acesteia

6. POSIBILITATI DE DEZVOLTARE ULTERIOARA


15

Aceasta prima versiune de automat bancar poate servi ca un exemplu de model de functionare al unui astfel de automat real deoarece are disponibile doar 16 conturi, iar daca ar fi sa ne raportam la lumea reala in care o banca are in jur de cateva milioane de clienti, acest numar este neseminificativ. Lasand la o parte acest dezavantaj care se poate remedia destul de usor prin largirea memoriilor in care sunt retinute soldurile si codurile PIN ale clientilor, automatului i se mai pot aduce imbunatatiri la nivelul numarului de operatii. Initial avem cele doua tipuri de consultare sold si eliberare numerar la care mai putem adauga schimbarea PIN-ului sau posibilitatea de a face transferuri intre doua conturi. Marind capacitatea memoriilor cu 16 biti acestea vor ajunge sa tina minte putin peste 1.000.000 de clienti.

16

17

You might also like