Sunteți pe pagina 1din 95

Laborator 1 Arhitecturi Hardware Reconfigurabile Descrierea, simularea i implementarea circuitelor logice utiliznd medii software de proiectare (Active HDL

7.1. i instrumente din pachetul Xilinx ISE 8.0) Con inut laborator: 1. Obiectivul lucrrii. 2. No iuni teoretice: a. Sisteme de reprezentare a numerelor. Transformri ntre sisteme de numerotare (recapitulare); b. Circuite logice combina ionale (recapitulare); c. Etape n proiectarea circuitelor logice utiliznd medii de proiectare software. 3. Cerin e laborator. 4. Tem. 1. Obiectivul lucrrii: Laboratorul se constituie ca un ndrumar pentru lucrul cu mediul de proiectare, simulare i implementare ActiveHDL pentru structuri de calculatoare numerice. Operarea cu acest mediu de dezvoltare presupune o serie de etape de lucru, etape care vor fi prezentate detaliat ntr-o anex, care va putea fi utilizat pe parcursul laboratoarelor ulterioare. Tot n aceast anex se va gsi si o prezentare a machetei de laborator care va fi folosit la implementri cu descrierea pinilor utiliza i. Pentru laboratoarele alocate disciplinei Calculatoare numerice sunt necesare cunotin e dobndite din cursuri anterioare despre circuitele logice combina ionale i secven iale, proiectarea circuitelor logice i moduri n care datele sunt reprezentate n circuite logice. De aceea, am adugat la acest laborator i un scurt breviar teoretic recapitulativ, referitor la subiectele sus men ionate. Utilitatea laboratorului: Toate etapele prezentate n lucrul cu mediul Active HDL vor fi utilizate i n celelalte laboratoare deci este esen ial n elegerea acestora. Parcurgerea etapelor pentru proiectarea, simularea i implementarea circuitelor este obligatorie exact n ordinea n care sunt prezentate n cele ce urmeaz. Orice abatere de la aceast ordine va avea drept urmare apari ia unor erori structurale sau func ionale. Pe de alt parte, mediile de proiectare pentru circuite logice sunt utilizate, la ora actual, pe scar larg n dezvoltarea profesionist a circuitelor integrate logice pe care le ntlnim n componen a calculatoarelor. Cunoaterea acestora este necesar pentru o viitoare carier de inginer n electronic. 2. No iuni teoretice a. Sisteme de reprezentare a numerelor. Transformri ntre sisteme de numerotare nc din coala primar noi suntem familiariza i cu sistemul de numerotare zecimal (n baza 10). Acesta utilizeaz zece cifre (0,1 9) cu ajutorul crora se poate construi orice numr. Sistemul de numerotare zecimal este utilizat n via a noastr de zi cu zi dar i n aproape toate domeniile tiin elor exacte: matematic, fizic, chimie etc.

n circuitele logice, care sunt componente de baz ale oricrei structuri dintr-un calculator, se utilizeaz sistemul de numerotare binar (n baza 2). Sistemul de numerotare binar utilizeaz doar dou cifre (0 i 1) pentru reprezentarea oricrui numr. Explica ia utilizrii acestui sistem de numerotare este una simpla: se poate implementa uor utiliznd contacte electronice, aa cum este reprezentat n figura 1. Acest sistem poate fi utilizat cu uurin pentru transmiterea datelor pe magistrale compuse din unul sau mai multe fire (prezen tensiune pe fir : 1 logic, absen tensiune : 0 logic) precum i pentru stocarea (memorarea) datelor n sisteme electronice (prezen sarcin, lips sarcin).

Fig.1. Reprezentarea binar a numerelor utiliznd contacte electronice Datorit utilizrii frecvente a sistemului de numerotare binar in calculatoare, s-a introdus o denumire special care se refer la cea mai mic cantitate de informa ie care se poate reprezenta printr-un numr i anume bitul. Bitul reprezint de fapt un numr binar (n baza 2) compus dintr-o singur cifr. Este utilizat ca unitate de msur n aproape toate subdomeniile calculatoarelor: l imea unei magistrale de date (cte fire pe care pot circula valori 0 sau 1 poate avea o magistrala), viteza unei transmisii de date (cte cifre de 0 sau 1 pot fi transmise pe un fir ntr-o secund), spa iul de memorare disponibil (cte celule care pot stoca 0 sau 1 are o memorie), dimensiunea numerelor (cte cifre de 0 sau 1 pot fi utilizate pentru reprezentarea unui numr) etc. Alturi de bit se utilizeaz i multiplii ai acestuia, prezenta i n tabelul de mai jos: Tabelul 1: Denumire multiplu Nibble (digit) Byte (B - octet) Word (W - cuvnt) Kilobit (kb) Megabit (Mb) Gigabit (Gb) Terabit (Tb) Numr de bi i 22 23 24 210 220 230 240

Ca extindere a reprezentrii numerelor n binar, se utilizeaz sistemul de numerotare hexazecimal (n baza 16). Orice numr se reprezint aici utiliznd digi i (cte 4 bi i). Fiecare valoare distinct a unui digit are alocat cte un simbol, cifre i litere: aa cum se poate vedea n tabelul de mai jos: Tabelul 2: Numr zecimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Numr binar (digit) 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 0001 0000 Numr hexazecimal 0 1 2 3 4 5 6 7 8 9 A B C D E F 10

Transformarea unui numr zecimal ntr-un numr binar se face prin mpr iri succesive la 2. Se vor lua resturile mpr irilor, n ordine inversa. De exemplu, pentru a determina valoarea numrului exprimat n zecimal 1234 n binar se fac mpr iri la 2 ca n tabelul de mai jos: 1234 617 308 154 77 38 19 9 4 2 1 :2 :2 :2 :2 :2 :2 :2 :2 :2 :2 :2 = = = = = = = = = = = 617 308 154 77 38 19 9 4 2 1 0 Rest 0 1 0 0 1 0 1 1 0 0 1

Numrul rezultat este 100 1101 0010b adic toate resturile citite n sens invers.

Transformarea unui numr binar ntr-unul zecimal se face nmul ind cu puterea lui 2 fiecare cifr din numrul binar, de la dreapta la stnga. Exemplu, numrul 1 0001 0110b se transform n zecimal astfel: 1 0001 0110b = 0 20 + 1 21 + 1 22 + 0 23 + 1 24 + + 0 25 + 0 26 + 0 27 + 1 28 = 2 + 4 + 16 + 256 = 278. Extrem de utile sunt transformarea binar hexazecimal i transformarea hexazecimal binar. Prima se face urmrind urmtorii pai: 1. Se desparte numrul n binar n grupe de cte 4 cifre (digi i) de la dreapta la stnga. 2. Fiecare digit se reprezint, conform tabelului 2, cu un simbol din hexazecimal. Exemplu: dac avem numrul binar 10010110111b pentru reprezentarea lui n hexazecimal se procedeaz astfel: 10010110111b = 100 1011 0111b = 4B7h Transformarea hexazecimal binar se face astfel: 1. Fiecare simbol hexazecimal (cifr sau liter) se nlocuiete cu un digit (4 bi i) binar, conform tabelului 2. Exemplu: pentru numrul A50B6h avem: A50B6h = 1010 0101 0000 1011 0110b Transformarea zecimal hexazecimal i hexazecimal zecimal se face similar cu cea din zecimal n binar respectiv din binar n zecimal dar, de data asta prin mpr iri la 16 sau prin adunri ntre puteri ale lui 16. n aceste laboratoare, numerele n binar vor fi nso ite de litera b (ex. 1001b) iar numerele n hexazecimal de litera h (ex. 10A8h). b. Circuite logice combina ionale n continuare sunt prezentate cteva circuite combina ionale elementare a cror cunoatere este obligatorie pentru nsuirea cunotin elor prezentate pe parcursul laboratoarelor: Tabelul 3: Denumire Poarta i (AND, SI) Simbol
I1 O I0

Descriere Descriere VHDL Cunoscut sub denumirea de minim. Dac una din cele dou intrri este 0 o <= i1 and i0; atunci ieirea este 0. Cnd ambele intrri sunt 1

Poarta sau (OR, SAU)

I1 O I0

Poarta exclusiv (XOR, EX)

sau SAU
I1 O I0

Poarta inversoare (INV) Multiplexorul cu 2 intrri i cu o ieire (MUX2:1)

ieirea este 1 Cunoscut sub denumirea de maxim. Dac una din cele 2 intrri este 1 atunci ieirea este 1. Cnd ambele intrri sunt 0 ieirea este 0. Cunoscut i sub denumirea de non echivalen . Dac cele dou intrri sunt egale (0 sau 1) atunci ieirea este 0 , daca sunt diferite ieirea este 1 Ieirea este negatul (CC1) intrrii. Dac pe intrarea s (selec ie) este 0 atunci pe ieirea y va fi conectat intrarea i0. Dac pe intrarea s este 1 atunci pe ieirea y va fi conectat intrarea i1. Dac pe intrarea s (selec ie) este 0 atunci ieirea y0 va fi conectat la intrarea e n timp ce ieirea y1 se va afla n starea inactiv. dac pe intrarea s este 1 atunci y0 va fi inactiv iar pe ieirea y1 se va conecta intrarea e.

o <= i1 or i0;

o <= i1 xor i0;

o <= not i;

U5
i0 i1 s y

with s select y <= i0 when '0', i1 when '1', '0' when others; process(e,s) begin if e = '1' then if s = '1' then y1 <= e; y0 <= '0'; else y0 <= e; y1 <= '0'; end if; else y0 <= '0'; y1 <= '0'; end if; end process;

mux2_1

Demultiplexorul cu o intrare i dou ieiri (DMUX1:2)


U6
e s y0 y1

dmux1_2

Exist circuite logice realizate din interconectarea ntre por i logice elementare care au deja denumiri consacrate: INV + AND = NAND (i negat), INV + OR = NOR (sau negat), INV + XOR = EQU (echivalen ). Cu excep ia inversorului, toate celelalte circuite pot avea un numr de intrri mai mare dect cel specificat n tabel dar func ionarea lor urmrete descrierea din tabel.

c. Etape n proiectarea circuitelor logice utiliznd medii de proiectare software Proiectarea unor circuite care s fie apoi implementate pe structuri hardware reconfigurabile, de tipul FPGA (Field Programmable Gates Array), se face prin utilizarea unor medii speciale de proiectare. De regul, fiecare fabricant de circuite reconfigurabile furnizeaz i propriile instrumente software de sintez i de implementare. Mediul de proiectare, simulare, implementare ActiveHDL realizat de firma Aldec permite selectarea instrumentelor software pentru sinteza i implementarea circuitelor logice n func ie de fabricant, astfel nct acesta poate lucra cu o clas foarte mare de circuite reconfigurabile. De asemenea acesta are trei metode prin care pot descrie circuitele logice: prin limbaj de descriere hardware, prin editarea schematic a circuitului sau prin maini de stare, pentru circuitele secven iale. n prezentarea etapelor din anexa ataat laboratorului, vor fi exemplificate doar primele dou metode de descriere, ntruct acestea vor fi utilizate n laboratoare. Dup descrierea circuitului, mediul ActiveHDL permite simularea comportamentului n timp a acestuia, astfel nct este posibil verificarea corectitudinii circuitului descris nainte ca acesta s fie procesat pentru implementarea n FPGA.

Fig.2. Etapele n proiectarea unui circuit logic utiliznd un mediu software de dezvoltare

Sinteza i implementarea sunt etapele care permit configurarea circuitului reconfigurabil selectat. Func ionarea acestuia se testeaz folosind machetele de laborator. Toate etapele prezentate n anexa ataat vor fi parcurse de-a lungul laboratoarelor pentru proiectarea unor arhitecturi de structuri de calculatoare numerice, simularea comportamentului acestora i implementarea lor. O parte din etapele prezentate n anex se vor referi la un exemplu de circuit: dar paii parcuri, aa cum am amintit, sunt universali valabili, indiferent de tipul circuitului. Etapa de simulare a fost prezentat in afara fluxului compilare sintez implementare din figura 2 deoarece este una op ional. Etapa de alocare a pinilor fizici, este i ea teoretic una op ional, dar este necesar pentru a putea efectua experimentele dorite pe macheta de laborator. Cerin e laborator: 1. S se identifice circuitele periferice de pe machet, prezentate n schema de la punctul F al anexei. 2. Parcurgnd etapele descrise n anex s se proiecteze, simuleze i implementeze un circuit de adunare a trei numere pe un bit (sumator complet pe un bit) avnd schema din figura 3. Rezolvare: 2.a. Se va crea proiectul (punctul A din anex). Se va descrie circuitul prezentat n figura de mai jos utiliznd editorul schematic (punctul B). Se va compila (punctul C). 2.b. Se va realiza simularea (punctul D) astfel: pe portul a se va conecta ca stimul un semnal de ceas cu frecven a 8 MHz. Pe portul b se va conecta ca stimul un semnal de ceas cu frecven a 4 MHz. Pe portul ci se va conecta ca stimul tasta C. Se va simula comportamentul circuitului pentru ci=0 i ci=1 trecnd prin toate strile intrrile a i b.

ci a b

I1 I1 O I0 I1 O I0 I1 O I1 O I0 I0 I0 O

co

Fig.3. Sumatorul complet pe un bit schema circuit 2.c. Se va realiza sinteza i implementarea circuitului pe macheta FPGA (punctul E) conectnd porturile logice ca n tabelul de mai jos (tabelul de la punctul F):

Port logic a b ci s co

Circuit machet sw_dip0 sw_dip1 sw_dip2 led0 led1

2.d. Se va descrca programul i se va opera cu el pe machet. 3. Parcurgnd etapele descrise n anex s se construiasc, utiliznd descrierea n VHDL (limbaj de descriere hardware), un circuit multiplexor 4:1. Circuitul va avea urmtoarele porturi: - 4 intrri, pe un bit fiecare, denumite i0, i1, i2 i i3; - 1 intrare pe doi bi i, denumit s; - 1 ieire pe un bit denumit y. S se sintetizeze i implementeze apoi circuitul, i s se descarce n machet.

U1
i0 i1 i2 i3 s(1:0) y

mux4_1
Fig.4. Multiplexorul 4:1 Rezolvare: 3.a. Se va crea un proiect (A). Se va crea, utiliznd Wizard, un fiier VHDL pentru descrierea n limbajul VHDL, avnd porturile specificate n problem. Dup crearea fiierului, se va aduga n arhitectur (ntre begin i end) codul vhdl care descrie comportamentul circuitului multiplexor 4:1. Acesta este prezentat n listingul de mai jos cu explica ii pentru fiecare instruc iune. Listing with s select y <= i0 when 00, Explica ie Testeaz starea intrrii s (pe 2 bi i).Dac intrarea s este: - 00 atunci pe ieirea y este conectat intrarea i0,

i1 when 01, i2 when 10, i3 when 11, 0 when others;

01 atunci pe ieirea y este conectat intrarea i1, 10 atunci pe ieirea y este conectat intrarea i2, 11 atunci pe ieirea y este conectat intrarea i0, alt valoare atunci ieirea y este conectat la 0 (caz practic imposibil dar cerut de sintaxa VHDL).

3.b. Se va sintetiza i implementa, porturile logice vor fi conectate ca n tabelul de mai jos: Port logic i0 i1 i2 i3 s[0] s[1] y Circuit machet sw_dip0 sw_dip1 sw_dip2 sw_dip3 sw_dip4 sw_dip5 led0

4. S se descrie utiliznd limbajul VHDL i mediul ActiveHDL i s se implementeze pe macheta cu FPGA urmtoarele 2 circuite: un demultiplexor 1:4 i un multiplexor 4:1 cu validarea ieirii. Rezolvare: ntr-un proiect creat n ActiveHDL se vor crea dou fiiere vhdl: dmux1_4.vhd i mux4_1_e.vhd utiliznd Wizard, aa cum se prezint n anex. Cele dou circuite care se doresc create au urmtorii pini de intrare ieire, prezenta i mai jos:

U1
e s(1:0) y(3:0)

U2
e i(3:0) s(1:0) y

dmux1_4
a) demultiplexor 1:4 b) multiplexor 4:1 cu validare ieire Fig.5. Circuitele descrise la problema 4 Pentru demultiplexor entitatea se va numi tot dmux1_4 iar arhitectura dmux1_4_a iar pentru multiplexor entitatea se va numi mux4_1_e iar arhitectura mux4_1_e_a. n fiierul dmux1_4.vhd, dup ce acesta a fost creat cu Wizard, se vor scrie n interiorul arhitecturii (ntre begin i end) urmtoarele:

mux4_1_e

Listing
process(e,s) begin if e = '1' then case s is when "00" => y <= "0001"; when "01" => y <= "0010"; when "10" => y <= "0100"; when "11" => y <= "1000"; when others =>y <= "0000"; end case; else y <= "0000"; end if; end process;

Explica ie
Bloc de comenzi secven iale care se activeaz la schimbarea strii lui e sau a lui s Dac intrarea e este 1 logic atunci Testeaz starea intrrii s. Dac intrarea s este: - 00 atunci pe ieirea y (4 bi i) vom avea 0001 adic y(0) = 1; - 01 atunci pe ieirea y vom avea 0010 adic y(1) = 1; - 10 atunci pe ieirea y vom avea 0100 adic y(2) = 1; - 11 atunci pe ieirea y vom avea 1000 adic y(3) = 1; - alt valoare dect cele mai de sus pe y vom avea 0000. Dac intrarea e nu este 1 logic (e = 0) atunci Ieirea y este 0000, deci to i bi ii de ieire vor fi dezactiva i adic 0 logic. Sfrit bloc de comenzi secven iale.

n fiierul mux4_1_e, dup ce acesta a fost creat cu Wizard, se vor scrie n interiorul arhitecturii (ntre begin i end) urmtoarele: Listing
process(e,i,s) begin if e = '1' then case s is when "00" => y <= i(0); when "01" => y <= i(1); when "10" => y <= i(2); when "11" => y <= i(3); when others => y <= '0'; end case; else y <= 'Z'; end if; end process;

Explica ie
Bloc de comenzi secven iale care se activeaz la schimbarea strii lui e, i sau s Dac intrarea e este 1 logic atunci Testeaz starea intrrii s. Dac intrarea s este: - 00 atunci pe ieirea y vom avea conectat intrarea i(0); - 01 atunci pe ieirea y vom avea conectat intrarea i(1); - 10 atunci pe ieirea y vom avea conectat intrarea i(2); - 11 atunci pe ieirea y vom avea conectat intrarea i(3); - alt valoare dect cele mai de sus pe y vom avea 0000. Dac intrarea e nu este 1 logic (e = 0) atunci Ieirea y este n nalt impedan . Sfrit bloc de comenzi secven iale.

Pentru implementarea pe machet, se urmresc etapele de sintez i implementare prezentate n anex. Alocarea pinilor se face astfel: Pentru demultiplexorul 1:4 avem: Port logic e s(0) s(1) y(0) y(1) y(2) y(3) Circuit machet sw_dip0 sw_dip1 sw_dip2 led0 led1 led2 led3

Pentru multiplexorul 4:1 cu validare avem:

Port logic e s(0) s(1) i(0) i(1) i(2) i(3) y 4. Tem

Circuit machet sw_dip0 sw_dip1 sw_dip2 sw_dip3 sw_dip4 sw_dip5 sw_dip6 led0

1. S se transforme din hexazecimal n binar urmtoarele numere: 3A0Bh, 12345h, B10h. 2. S se transforme din binar n hexazecimal urmtoarele numere: 1000110111b, 101011b, 1000000001111b. 3. S se descrie, utiliznd limbajul VHDL, un multiplexor 8:1. Se cer simulri ale circuitului utiliznd mediul ActiveHDL. 4. Utiliznd multiplexorul de la punctul 3 i multiplexorul 4:1 prezentat n laborator s se construiasc (utiliznd editorul schematic) un multiplexor 32:1. Se cer simulri ale circuitului, utiliznd mediul ActiveHDL. Criterii de evaluare: Cerin e laborator 1 1p 2 2p 3 2p 4 2p Tem 1 0,5p 2 0,5p 3 2p 4 3p

Laborator 2 Arhitecturi Hardware Reconfigurabile Proiectarea unor structuri logice hardware utiliznd circuite reconfigurabile static. Tehnici de lucru cu limbaje de descriere hardware Con inut laborator: 1. Obiectivul lucrrii. 2. No iuni teoretice: a. Structura unei descrieri n VHDL b. Descrierea structurala a circuitelor logice n VHDL; c. Descrierea comportamentala a circuitelor logice n VHDL; 3. Cerin e laborator. 4. Tem. 1. Obiectivul lucrrii: Laboratorul este organizat ca un scurt, dar util, ghid pentru lucrul cu limbajul de descriere hardware VHDL (VHSIC Very High Scale Integration Circuit Hardware Description Language). Acesta este utilizat pentru descrierea circuitelor logice n vederea implementrii n arii de por i logice programabile. Din categoria ariilor de por i logice programabile moderne fac parte i circuitele FPGA (Field Programmable Gates Array Matrici de cmpuri de por i programabile). ntreg fluxul de dezvoltare, pornind de la descrierea circuitului pn la implementarea sa pe FPGA poate fi privit ca un proces de reconfigurabilitate static. Comportamentul sistemului cu circuit FPGA poate fi schimbat complet prin reconfigurarea acestuia cu o alta descriere VHDL. Pe de alt parte, reconfigurabilitatea este una static deoarece este un proces prin care toate func iile curente pe care circuitul FPGA le are sunt suspendate, deci este scos din regimul normal de operare, i, n plus, este un proces care necesit prezen a dezvoltatorului, cel care realizeaz descrierea. Dup enumerarea instruc iunilor n VHDL, n cadrul prezentrii teoretice, lucrarea continu cu prezentarea, sub forma de probleme, a unor descrieri de structuri logice, cu implementare practic. Utilitatea laboratorului: Departe de a-i propune s prezinte n ntregime subtilit ile limbajului de descriere hardware, lucrarea con ine, n principiu, toate no iunile de baz de VHDL care vor fi necesare pentru lucrul n laboratoarele urmtoare. Totodat, lucrarea poate fi util ca punct de plecare pentru oricine dorete o carier n domeniul proiectrii circuitelor logice digitale utiliznd limbaje hardware de descriere. 2. No iuni teoretice a. Structura unei descrieri n VHDL O descriere a unui circuit logic ntr-un limbaj de descriere hardware nu poate fi fcut dect atunci cnd sunt cunoscute foarte clar caracteristicile circuitului care se dorete descris. Deci, este necesar cunoaterea parametrilor circuitului cum ar fi numr

intrri, tip semnale intrare, numrul i tipul semnalelor de ieire dar i a func iei pe care acesta trebuie s o ndeplineasc: structura intern, comportamentul circuitului. Din acest motiv, orice descriere n VHDL este structurat pe dou module: declara ia entit ii i declara ia arhitecturii. Din punct de vedere al entit ii, circuitului este privit ca o cutie neagra cu porturile de intrare i ieire specificate, aa cum se poate vedea n exemplul din figura de mai jos (fig. 1). entity bistabil is port( d : in STD_LOGIC; clk : in STD_LOGIC; q : out STD_LOGIC ); end bistabil; Fig.1. Circuitul logic ca entitate n entitate sunt declarate porturile de intrare i ieire. Aa cum se vede n exemplu din figura 1, declara ia unui port se face respectnd sintaxa: nume_port : direc ionalitate tip_port; cu urmtoarele valori prezentate n tabelul 1: Nume Nume_port Descriere Numele portului Valori posibile Poate con ine litere, cifre i caracterul _ (underscore). ntotdeauna trebuie s nceap cu o liter i nu poate con ine caracterul _ dublu (__) In : port intrare Out : port ieire Buffer : port ieire care poate fi conectat ca intrare la un modul intern component al circuitului descris Inout : port care poate fi i ieire i intrare Bit : port pe un bit care poate lua valorile 0 sau 1 Bit_vector (lungime-1 downto 0) : magistral pe mai mul i bi i, de dimensiune lungime vector de bi i Std_logic : port pe un bit care poate lua valorile 0, 1, Z (nalt impedan ), X (necunoscut), U (nealocat), - (nu conteaz) etc. conform standardului 1164. Trebuie inclus librria 1164

Direc ionalitate

Direc ionalitatea portului

Tip_port

Tipul portului declarat

pentru a putea fi utilizat acest tip. Std_logic_vector (lungime-1 downto 0) : magistral de semnale std_logic de dimensiunea lungime. Trebuie inclus librria 1164 pentru a putea fi utilizat acest tip. Positive : port de tip numr natural. Integer: port de tip numr ntreg. Boolean: port de tip boolean. Poate avea valorile true (adevrat) sau false (fals). Arhitectura con ine descrierea circuitului ca schem de componente constituente sau ca func ionalitate.

Fig.2. Circuitul logic ca arhitectur Descrierea func ionalit ii circuitului n arhitectur se poate face n mai multe feluri aa cum se va prezenta n paragrafele urmtoare. n general, structura unei arhitecturi este declarat astfel: architecture nume_arhitectur of nume_entitate_asociat is --declaratii semnale Signal nume_semnal : tip_semnal; -- declara ii componente -- declara ii tipuri de date begin --corp arhitectur end nume_arhitectur; Semnalele, n terminologia VHDL, reprezint cile interne de transfer al informa iei ntre modulele componente ale unui circuit descris. Numele semnalului i tipul semnalului trebuie s ndeplineasc aceleai cerin e ca la definirea numelui i tipului portului din entitate. Componentele nu sunt neaprat prezente n orice descriere VHDL. Asupra modului de declarare al acestora se va reveni n paragraful urmtor. Dac se dorete, pot fi create propriile tipuri de semnale. Declara ia unui tip nou de semnal are urmtoarea sintax:

type nume_tip_semnal is tip_semnal_asociat; Tip semnal asociat trebuie s fie unul din tipurile predefinite n librriile VHDL sau o matrice de semnale. Exist mai multe metode prin care poate fi descris func ionalitatea circuitelor logice n VHDL: descrierea structural i descrierea comportamental. b. Descrierea structural a circuitelor logice n VHDL
Descrierea n VHDL a unui sistem la nivel structural presupune specificarea componentelor din care sistemul este constituit i modul n care acestea sunt interconectate. Componentele pot fi la nivel de por i logice elementare dar pot fi i circuite mai complexe, descrise ulterior n alte por iuni ale proiectului. Conectrile ntre componente se fac prin intermediul instruc iunilor de atribuire i prin hr i de porturi n cadrul apelului unei componente. a.1. Atribuirea semnalelor Atribuirea semnalelor se face n limbajul VHDL prin simbolul <= de forma urmtoare: Semnal_destina ie <= Semnal_surs; Exemplu: a <= b or c; Semnifica ia instruc iunii de mai sus este urmtoarea: Semnal_destina ie este conectat la Semnal_surs. Semnalul destina ie este ntotdeauna unul singur n timp ce semnalul surs poate fi un singur semnal sau mai multe aflate ntr-o anumit rela ie (logic, aritmetic). Deci se poate vorbi de o conectare de tipul rezultat, i anume: rezultatul unei opera ii dintre mai multe semnale este conectat la semnalul destina ie. O condi ie esen ial la atribuire este aceea ca dimensiunea semnalelor din ambele pr i ale operatorului s fie aceeai. 1.1. Opera ii logice Fiecare instruc iune din VHDL reprezint de fapt descrierea unui circuit. Pentru circuitele por i logice elementare exist cuvinte cheie alocate n VHDL. Astfel: - SI logic se descrie utiliznd cuvntul cheie and. Exemplu: t1 <= a and b; - SAU logic se descrie utiliznd cuvntul cheie or. Exemplu: co <= t1 or t2; - SAU EXCLUSIV logic se descrie utiliznd cuvntul cheie xor. Exemplu: stemp <= a xor b; - INVERSAREA sau CC1 se reprezint utiliznd cuvntul cheie not. Exemplu: b_int <= not b;

Toate expresiile care n exemplele de mai sus au 2 operanzi pot avea mai mul i pentru a descrie por i logice elementare cu mai mult de 2 intrri. De asemenea se pot declara i expresii logice combinate pentru a desemna mai multe por i logice interconectate. Exemplu: s<= not (stemp xor ci);
1.2. Declararea componentelor La proiectarea unor sisteme mai complexe se folosete foarte des metoda bottom up. Aceasta presupune ini ial proiectarea circuitelor componente, de complexitate mai mic, urmnd apoi integrarea acestora n sistemul complex. n cazul n care circuitul care se dorete inclus ntrun sistem este declarat n alt parte a proiectului, este ntr-o librrie a limbajului VHDL sau ntrun set de primitive, se utilizeaz declara ia de componente. Aceasta se face prin cuvntul cheie component. Structura unei declara ii de componente este prezentat mai jos: component nume_circuit is port( declara ii porturi ); generic( declara ii parametrii ); end component; nume_circuit : reprezint numele circuitului care se dorete integrat aa cum acesta a fost declarat n entitatea sa. Exemplu: component poarta_sau is port( intrare : in std_logic_vector(dim-1 downto 0); iesire : out std_logic ); generic( dim : positive ); end poarta_sau; Declara iile de porturi i de parametrii trebuie s urmreasc exact denumirile care au fost utilizate n entitate. Declara ia unei componente se face dup ce a fost precizat numele arhitecturii din care componenta va face parte, dar nainte de a ncepe corpul propriu zis al arhitecturii (nainte de begin). Apelarea componentei se face n corpul arhitecturii. O component se apeleaz utiliznd urmtorul format: nume_circuit_local : nume_circuit port map (asocieri de porturi) generic map (asocieri de parametrii); nume_circuit_local : reprezint numele care l va avea circuitul n sistemul n care este integrat.

Pentru un sistem care are mai multe circuite va trebui s se utilizeze denumiri diferite la fiecare. Singura excep ie este atunci cnd se utilizeaz generatorul ciclic de circuite. nume_circuit: reprezint numele circuitului integrat, aa cum acesta a fost declarat n entitatea proprie. Exemplu: poarta_sau_5 : poarta_sau port map(a_in,b_out) generic map(5); Asocierile de porturi i asocierile de parametrii se fac prin listarea semnalelor care se doresc conectate la porturile respective. Dimensiunea i tipul semnalelor conectate la porturi trebuie s fie aceleai cu cele declarate n entitatea componentei. n cazul n care se dorete integrarea ntr-un sistem a mai multor circuite de acelai tip se recomand utilizarea generatorului ciclic de circuite. Declararea acestuia, tot n interiorul arhitecturii se face n felul urmtor: nume_grup_circuite : for i in valoare_initial to valoare_final generate apeluri componente end generate; nume_grup_circuite: reprezint numele grupului de circuite aa cum acesta va fi recunoscut n sistem. Exemplu: grup_4_porti : fori in 0 to 3 generate poarta_sau_5 : poarta_sau port map(a_in,b_out(i)) generic map(5); end generate; Dac sunt declarate mai multe grupuri de circuite, fiecare va trebui s aib propriul su nume, excep ie fcnd cazul n care un grup de circuite este declarat la rndul lui ntr-un generator ciclic de circuite. Contorul de circuite i poate lua orice valoare ini ial i final (numere ntregi) i poate fi utilizat i ca index de semnal n cazul utilizrii unor vectori de semnale n apelul componentelor din interiorul generatorului. Alturi de componente se pot efectua, n generatorul ciclic, opera ii de atribuiri de semnale sau chiar alte generatoare ciclice de circuite.

c. Descrierea comportamental a circuitelor n VHDL O alt solu ie n descrierea func ional a circuitelor n limbajul VHDL este descrierea comportamental n procese. Un proces este un modul care poate fi privit similar cu o component de la descrierea structural. Are propriile sale intrri i ieiri i mai multe procese ruleaz n paralel unul fa de cellalt, comunicnd ntre ele prin semnale (signal). Spre deosebire de o component, procesul con ine n interiorul su un program secven ial care i descrie comportamentul. Acesta poate avea variabile locale, instruc iuni decizionale, ciclice i chiar apeluri de func ii. Instruc iunile se execut secven ial, n sensul n care acestea sunt scrise n interiorul procesului, iar cnd se ajunge la sfrit procesul ntr ntr-o stare de ateptare. El se va reactiva la modificarea strii oricrei intrri precizate n lista de senzitivit i. Structura unui proces declarat n VHDL este urmtoarea:

[etichet:] process (list semnale senzitivit i) declara ii variabile; begin instruc iuni secven iale; end process; Exemplu: process(clk,d) variable q_int : std_logic; begin if clkevent and clk=1 then q_int := d; end if; end process; Eticheta este op ional i, n cazul n care este declarat, trebuie s fie unic. Restric iile sintaxei utilizate la declara ia etichetei sunt similare cu cele de la etichetele de la componente descrise n laboratorul trecut. Semnalele care se gsesc pe lista de senzitivit ii a procesului sunt cele care vor declana execu ia acestuia i mai sunt cunoscute i ca intrri ale procesului. Procesul reprezint de fapt o secven infinit. Starea acestuia alterneaz ntre ateptare i executarea instruc iunilor secven iale descrise n interiorul lui. Ini ial procesul intr ntr-o stare de ateptare, pn cnd se schimb starea cel pu in a unuia din semnalele din lista de senzitivit i. Din acest moment sunt executate instruc iunile secven iale din corpul procesului. La terminarea execu iei acestora procesul reintr n starea de ateptare iar ciclul se reia. Variabilele declarate n interiorul procesului au urmtoarea structur: variable denumire : tip variabil; unde denumire i tip sunt similare cu cele de la declara ia semnalelor. Exemplu: variable q_int : std_logic; O variabil este vizibil numai n interiorul procesului. Comunicarea ntre procese se face prin intermediul semnalelor. Printre instruc iunile secven iale, care pot exista n interiorul unui proces men ionm urmtoarele: - Instruc iunea condi ionat: if condi ie logic then bloc de instruc iuni 1; [else bloc de instruc iuni 2;] end if;

Exemplu: if a=1 then b_out <= 1; c_out <= 0; else b_out <= 0; c_out <= 1; end if; Instruc iunea este una tipic pentru un limbaj de programare de nivel nalt. Dac condi ia logic (o expresie care are drept rezultat adevrat (true) sau fals (false) ) este adevrat atunci se execut blocul de instruc iuni 1. Op ional se poate trata cazul n care condi ia logic nu este adevrat, cnd se execut cel de-al doilea bloc de instruc iuni. Condi ia logic poate fi dat de propozi ii logice care utilizeaz operatorii de comparare: =, <, >, <=, >=, <> i propozi ii logice compuse utiliznd and i or. Tot aici pot fi prezente i atributele. Un atribut destul de des utilizat este atributul event. Acesta indic faptul c pe semnalul cruia i este asociat a aprut o schimbare de stare. De exemplu: If clkevent and clk=1 then s-ar putea traduce n felul urmtor: dac pe semnalul clk a aprut un eveniment (i-a schimbat starea) i semnalul de ceas este acum 1 logic atunci . Instruc iunea condi ionat multipl:

case expresie de intrare is when valoare 1 expresie de intrare => bloc de instruc iuni 1; when valoare 2 expresie de intrare => bloc de instruc iuni 2; when others => bloc de instruc iuni i; end case; Exemplu: case s is when 0 => y0 <= 1; y1 <= 0; when others => y0 <= 0; y1 <= 1; end case; Expresia de intrare poate fi o condi ie logic dar i o variabil, un semnal sau un apel de func ii. Instruc iunea permite testarea mai multor valori ale expresiei de intrare i rspunsul la acestea. Astfel, dac expresia de intrare are valoarea 1 atunci se execut blocul de instruc iuni 1, dac are valoarea 2 se execut blocul de instruc iuni 2 .a.m.d. n mod obligatoriu, trebuie s existe i cazul others n care expresia de intrare are alt

valoare dect cele precizate explicit. n acest caz se execut blocul de instruc iuni i. Blocul i poate lipsii dar nu se poate s nu existe cazul others specificat. De men ionat aici ar fi i instruc iunea condi ionat de selec ie withselect care nu se declar n interiorul unui proces. Sintaxa acesteia este urmtoarea: with semnal intrare select semnal ieire <= valoare 1 semnal ieire when valoare 1 semnal intrare, valoare 2 semnal ieire when valoare 2 semnal intrare, valoare semnal ieire i when others; Exemplu: with sel select y <= i0 when 0, i1 when others; Cele dou instruc iuni sunt asemntoare dar contextul n care sunt apelate este complet diferit. Aa cum am men ionat, aceast instruc iune nu se declar n interiorul unui proces. Pentru aceast instruc iune este construit un bloc de selec ie separat, care va lucra n paralel cu orice eventual proces declarat n corpul arhitecturii. Dac semnalul de intrare are valoarea 1 atunci pe ieire este generat valoarea 1 pentru semnalul de ieire. Dac semnalul de intrare are valoarea 2 atunci pe ieire este generat o alt valoare 2 pentru semnalul de ieire, .a.m.d. Dac semnalul de intrare nu are nici una din valorile de precizate mai sus atunci pe ieire va fi valoarea i. Instruc iunea de execu ie ciclic:

Sintaxa acesteia este urmtoarea: for nume contor in valoare ini ial contor to valoare final contor [step pas incrementare contor] loop bloc de instruc iuni; end loop; Exemplu: for i in 0 to 9 loop v(i) <= I; end loop; Instruc iunea execut blocul de instruc iuni de un anumit numr de ori, precizat prin valoarea ini ial, valoarea final i pasul de incrementare al contorului. Contorul, al crui nume este precizat imediat dup for, se comport ca o variabil local, vizibil numai n interiorul instruc iunii for. Nu se declar n sec iunea de variabile, i poate fi utilizat pentru indexarea unor vectori sau n alte opera ii. Precizm c instruc iunea for nu are nici un fel de legtur cu instruc iunea forgenerate prezentat n paragraful anterior i utilizat la descrierea structural.

Cerin e laborator: 1. S se descrie n limbajul VHDL dou circuite: un circuit de adunare a doi operanzi pe 4 bi i fiecare i un circuit de scdere pentru aceeai doi operanzi. Operanzii se vor introduce de la butoanele comutatoare (SW_DIP) iar rezultatul este afiat pe dispaly-ul cu led-uri 7 segmente. 1. Proiectarea circuitului de adunare n VHDL. Dup crearea unui proiect n ActiveHDL (etape prezentate n anexa care exist n acelai director cu platforma de laborator), pentru proiectarea circuitului de adunare se vor urma paii: a. se va crea un fiier nou, VHDL, utiliznd wizard-ul, denumit sum1bit.vhd. Aici se va descrie sumatorul complet pe un bit care va intra n componen a att a circuitului de adunare ct i a celui de scdere. Structura sumatorului pe un bit, la nivel de semnale de intrare i ieire este prezentat n figura de mai jos.
U1
a b ci co s

sum1bit

Circuitul are 3 intrri pe un bit (a,b,ci) i dou ieiri pe un bit (co,s). Declara ia acestuia n VHDL, dup construirea fiierului vhdl, va fi urmtoarea: library IEEE; use IEEE.STD_LOGIC_1164.all; entity sum1bit is port( a : in STD_LOGIC; b : in STD_LOGIC; ci : in STD_LOGIC; s : out STD_LOGIC; co : out STD_LOGIC ); end sum1bit;

architecture sum1bit_a of sum1bit is

signal stemp,t1,t2 : std_logic; begin stemp <= a xor b; t1 <= a and b; s<= stemp xor ci; t2 <= stemp and ci; co <= t1 or t2; end sum1bit_a; b. se va crea un fiier denumit adunare.vhd. Acesta va reprezenta circuitul de adunare a dou numere pe patru bi i fiecare. Structura sa este reprezentat n figura de mai jos.
U2
a(3:0) b(3:0) s(3:0)

adunare

Circuitul are dou intrri pe 4 bi i fiecare i o ieire pe 4 bi i. Structura sa intern, dup crearea fiierului, trebuie s fie urmtoarea. library IEEE; use IEEE.STD_LOGIC_1164.all; entity adunare is port( a : in STD_LOGIC_VECTOR(3 downto 0); b : in STD_LOGIC_VECTOR(3 downto 0); s : out STD_LOGIC_VECTOR(3 downto 0) ); end adunare;

architecture adunare_a of adunare is signal trans : std_logic_vector(4 downto 0); component sum1bit is port( a : in STD_LOGIC; b : in STD_LOGIC; ci : in STD_LOGIC; s : out STD_LOGIC; co : out STD_LOGIC ); end component;

begin

sumatoare: for i in 0 to 3 generate suma : sum1bit port map (a(i),b(i),trans(i),s(i),trans(i+1)); end generate; trans(0) <= '0'; end adunare_a; 2. Proiectarea circuitului de scdere Pentru circuitul de scdere este necesar proiectarea unui circuit de selec ie pentru dou numere ep 4 bi i fiecare. Circuitul de selec ie va fi descris ntr-un fiier nou creat, denumit selectie.vhd, i are urmtoarea structur:
U5
i0(3:0) i1(3:0) s y(3:0)

selectie

Circuitul are 2 intrri pe 4 bi i fiecare, denumite aici i0 i i1 i o intrare de selec ie s pe un bit. De asemenea, circuitul are o ieire pe 4 bi i denumit y. Descrierea circuitului este prezentat n listingul de mai jos. library IEEE; use IEEE.STD_LOGIC_1164.all; entity selectie is port( s : in STD_LOGIC; i0 : in STD_LOGIC_VECTOR(3 downto 0); i1 : in STD_LOGIC_VECTOR(3 downto 0); y : out STD_LOGIC_VECTOR(3 downto 0) ); end selectie;

architecture selectie_a of selectie is begin with s select y <= i0 when '0', i1 when '1', "0000" when others;

end selectie_a; Structura circuitului de scdere, creat n fiierul scdere.vhd, este prezentat n figura de mai jos.
U3
a(3:0) b(3:0) d(3:0) s

scadere

Circuitul are dou intrri pe 4 bi i fiecare (a i b), o ieire pe 4 bi i (d) i un bit de ieire pentru semn (s). Structura circuitului este declarat n listingul de mai jos. library IEEE; use IEEE.STD_LOGIC_1164.all; entity scadere is port( a : in STD_LOGIC_VECTOR(3 downto 0); b : in STD_LOGIC_VECTOR(3 downto 0); d : out STD_LOGIC_VECTOR(3 downto 0); s : out STD_LOGIC ); end scadere; architecture scadere_a of scadere is signal a_int, b_int, s_int : std_logic_vector(4 downto 0); signal s_intnot, s_int2 : std_logic_vector(3 downto 0); signal trans : std_logic_vector(5 downto 0); signal trans2 : std_logic_vector(4 downto 0); component sum1bit is port( a : in STD_LOGIC; b : in STD_LOGIC; ci : in STD_LOGIC; s : out STD_LOGIC; co : out STD_LOGIC ); end component; component selectie is port( s : in STD_LOGIC; i0 : in STD_LOGIC_VECTOR(3 downto 0);

i1 : in STD_LOGIC_VECTOR(3 downto 0); y : out STD_LOGIC_VECTOR(3 downto 0) ); end component; begin sumatoare : for i in 0 to 4 generate suma : sum1bit port map(a_int(i),b_int(i),trans(i),s_int(i),trans(i+1)); end generate; sumatoare2 : for i in 0 to 3 generate suma2 : sum1bit port map('0',s_intnot(i),trans2(i),s_int2(i),trans2(i+1)); end generate; se : selectie port map(s_int(4),s_int(3 downto 0),s_int2(3 downto 0),d); trans(0) <= '1'; trans2(0) <= '1'; a_int(3 downto 0) <= a; a_int(4) <= '0'; b_int(3 downto 0) <= not b; b_int(4) <= '1'; s <= s_int(4); s_intnot <= not s_int(3 downto 0); end scadere_a; 3. Descrierea ntregului sistem: Pentru a descrie ntreg sistemul este necesar i proiectarea unui circuit decodor 7 segmente care permite afiarea cifrelor pe display-ul cu LED-uri. Decodorul 7 segmente se va descrie ntr-un fiier denumit decodor.vhd. Structura acestuia este prezentat n figura de mai jos.
U4
digital(3:0) led(6:0)

decodor

Circuitul are o intrare pe 4 bi i (digital) i o ieire pe 7 bi i (led). Descrierea acestuia n VHDL este urmtoarea: library IEEE; use IEEE.STD_LOGIC_1164.all; entity decodor is

port( digital : in STD_LOGIC_VECTOR(3 downto 0); led : out STD_LOGIC_VECTOR(6 downto 0) ); end decodor; architecture decodor_a of decodor is begin with digital select led <= "0111111" when "0000", "0000110" when "0001", "1011011" when "0010", "1001111" when "0011", "1100110" when "0100", "1101101" when "0101", "1111101" when "0110", "0000111" when "0111", "1111111" when "1000", "1101111" when "1001", "1110111" when "1010", "1111100" when "1011", "0111001" when "1100", "1011110" when "1101", "1111001" when "1110", "1110001" when "1111", "0000000" when others; end decodor_a; Structura sistemului care se dorete realizat este prezentat n figura de mai jos. Sistemul va avea dou intrri (op1 i op2) pe patru bi i fiecare, dou ieiri (rez1 i rez2) pe 7 bi i i o ieire (semn) pe un bit. Intrrile vor fi generate de la comutatoarele (SW_DIP) de pe bareta de comutatoare a machetei cu Spartan 3 iar ieirile vor fi conectate la afioarele 7 segmente. Sistemul va fi descris n limbajul VHDL ntr-un fiier nou, intitulat sistem.vhd.

Descrierea n VHDL a sistemului este prezentat n listing-ul de mai jos: library IEEE; use IEEE.STD_LOGIC_1164.all; entity sistem is port( op1 : in STD_LOGIC_VECTOR(3 downto 0); op2 : in STD_LOGIC_VECTOR(3 downto 0); rez1 : out STD_LOGIC_VECTOR(6 downto 0); rez2 : out STD_LOGIC_VECTOR(6 downto 0); semn : out STD_LOGIC ); end sistem;

architecture sistem_a of sistem is signal rez_a, rez_s : std_logic_vector(3 downto 0);

component adunare is port( a : in STD_LOGIC_VECTOR(3 downto 0); b : in STD_LOGIC_VECTOR(3 downto 0); s : out STD_LOGIC_VECTOR(3 downto 0) ); end component; component scadere is port( a : in STD_LOGIC_VECTOR(3 downto 0); b : in STD_LOGIC_VECTOR(3 downto 0); d : out STD_LOGIC_VECTOR(3 downto 0); s : out STD_LOGIC ); end component; component decodor is port( digital : in STD_LOGIC_VECTOR(3 downto 0); led : out STD_LOGIC_VECTOR(6 downto 0) ); end component; begin ad : adunare port map(op1,op2,rez_a); sc : scadere port map(op1, op2,rez_s,semn); dec1 : decodor port map(rez_a,rez1); dec2 : decodor port map(rez_s,rez2); end sistem_a; Intrrile i ieirile din sistem se vor asocia cu pinii FPGA care sunt conecta i la grupul de comutatoare (SW_DIPx) sau la afioarele de led-uri 7 segemente (DIGxSEGy). Valorile pinilor sunt date n anexa asociat cu acest laborator, n ultima parte alocat prezentrii machetei. 2. S se construiasc un cronometru digital. Acesta va avea ca intrri trei butoane (SW_USER0, SW_USER1 i SW_USER2) unul pentru start, al doilea pentru stop i cel de-al treilea pentru reset. Ieirile vor fi conectate la 6 afiaje 7 segmente. Pe afiaj se va afia timpul n formatul mmsszz (mm minute, ss secunde i zz zecimi de secunda). Pe machet aceste ieiri sunt notate cu DIGxSEGy unde x reprezint digitul (0 e cel mai din stnga) i z reprezint segmentul. Ca intrare referin de timp se va utiliza intrarea de ceas GCLK de la machet (pentru coresponden a pinilor vezi anexa de la laborator). n figura de mai jos este prezentat sistemul descris ca semnale de intrare i de ieire.

U1
gclk reset start stop data _out(41:0)

crono

Schema constructiv sau func ional a cronometrului este prezentat mai jos:

a. Decodorul 7 segmente (decod7seg.vhd)


U2
binar(3:0) bcd(6:0)

decod7seg

library IEEE; use IEEE.STD_LOGIC_1164.all; entity decod7seg is port( binar : in STD_LOGIC_VECTOR(3 downto 0); bcd : out STD_LOGIC_VECTOR(6 downto 0) ); end decod7seg; architecture decod7seg_a of decod7seg is begin

with binar select bcd <= "0111111" when "0000", "0000110" when "0001", "1011011" when "0010", "1001111" when "0011", "1100110" when "0100", "1101101" when "0101", "1111101" when "0110", "0000111" when "0111", "1111111" when "1000", "1101111" when "1001", "0000000" when others; end decod7seg_a; b. Circuitul pentru debouncing (deb.vhd)
U3
clk reset clk_out

deb

library IEEE; use IEEE.STD_LOGIC_1164.all; entity decod7seg is port( binar : in STD_LOGIC_VECTOR(3 downto 0); bcd : out STD_LOGIC_VECTOR(6 downto 0) ); end decod7seg; --}} End of automatically maintained section architecture decod7seg_a of decod7seg is begin with binar select bcd <= "0111111" when "0000", "0000110" when "0001", "1011011" when "0010", "1001111" when "0011", "1100110" when "0100", "1101101" when "0101", "1111101" when "0110", "0000111" when "0111", "1111111" when "1000", "1101111" when "1001",

"0000000" when others; end decod7seg_a; c. Divizorul de frecven (divizor.vhd)


U4
clk reset clk_out

divizor

library IEEE; use IEEE.STD_LOGIC_1164.all; entity divizor is port( clk : in STD_LOGIC; reset : in STD_LOGIC; clk_out : out STD_LOGIC ); end divizor; architecture divizor_a of divizor is begin process(clk,reset) variable cnt : integer; begin if clk'event and clk='1' then if reset = '0' then -- tasta neapasata cnt := 0; clk_out <= '0'; else -- tasta apasata if cnt = 500000 then clk_out <= '1'; cnt := 0; else clk_out <= '0'; cnt := cnt + 1; end if; end if; end if; end process; end divizor_a; d. Cronometru

library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_UNSIGNED.all; entity crono is port( gclk : in STD_LOGIC; reset : in STD_LOGIC; start : in STD_LOGIC; stop : in STD_LOGIC; data_out : out STD_LOGIC_VECTOR(41 downto 0) ); end crono; architecture crono_a of crono is --declaratii componente component decod7seg is port( binar : in STD_LOGIC_VECTOR(3 downto 0); bcd : out STD_LOGIC_VECTOR(6 downto 0) ); end component; component deb is port( clk : in STD_LOGIC; reset : in STD_LOGIC; clk_out : out STD_LOGIC ); end component; component divizor is port( clk : in STD_LOGIC; reset : in STD_LOGIC; clk_out : out STD_LOGIC ); end component; --declaratii semnale --evenimente taste signal ev_start, ev_stop, ev_reset : std_logic; --semnal 10ms signal div10ms : std_logic; --semnal de la sutimi la secunde signal sut_sec : std_logic; --semnal de la secunde la minute signal sec_min : std_logic; --semnale iesire numaratoare sutimi, secunde, minute

signal sutimi, secunde, minute : std_logic_vector(7 downto 0); begin --evenimente taste butstart : deb port map(gclk,start,ev_start); butstop : deb port map(gclk,stop,ev_stop); butreset : deb port map(gclk,reset,ev_reset); --divizor 10 milisecunde diviz10ms : divizor port map(gclk,reset,div10ms); --numarator sutimi de secunda process(div10ms,ev_start,ev_stop,ev_reset) variable cnt_unit, cnt_zeci : std_logic_vector(3 downto 0); variable c_out : std_logic; variable stare_numarare : boolean; begin --daca este reset apasat reseteaza contorul if ev_reset = '1' then cnt_unit := "0000"; cnt_zeci := "0000"; stare_numarare := false; c_out := '0'; else --daca nu testeaza starea butoanelor de start sau stop if ev_start = '1' then stare_numarare := true; end if; if ev_stop = '1' then stare_numarare := false; end if; --in cazul in care stare numarare este true atunci numara secundele if div10ms'event and div10ms='1' and stare_numarare = true then cnt_unit := cnt_unit+'1'; if cnt_unit = "1010" then cnt_unit := "0000"; cnt_zeci := cnt_zeci + '1'; if cnt_zeci = "1010" then cnt_zeci := "0000"; c_out := '1'; else c_out := '0'; end if; else c_out := '0';

end if; end if; end if; --actualizarea semnalelor de iesire sutimi(3 downto 0) <= cnt_unit; sutimi(7 downto 4) <= cnt_zeci; sut_sec <= c_out; end process; --numarator secunde process(sut_sec,ev_reset) variable cnt_unit, cnt_zeci : std_logic_vector(3 downto 0); variable c_out : std_logic; begin --daca este reset apasat reseteaza contorul if ev_reset = '1' then cnt_unit := "0000"; cnt_zeci := "0000"; c_out := '0'; else --daca nu testeaza eveniment pe intrarea sut_sec if sut_sec'event and sut_sec='1' then cnt_unit := cnt_unit+'1'; if cnt_unit = "1010" then cnt_unit := "0000"; cnt_zeci := cnt_zeci + '1'; if cnt_zeci = "0110" then cnt_zeci := "0000"; c_out := '1'; else c_out := '0'; end if; else c_out := '0'; end if; end if; end if; --actualizare semnale secunde(3 downto 0) <= cnt_unit; secunde(7 downto 4) <= cnt_zeci; sec_min <= c_out; end process; --numarator minute process(sut_sec,ev_reset) variable cnt_unit, cnt_zeci : std_logic_vector(3 downto 0);

begin --daca este reset apasat reseteaza contorul if ev_reset = '1' then cnt_unit := "0000"; cnt_zeci := "0000"; else --daca nu testeaza eveniment pe intrarea sut_sec if sut_sec'event and sut_sec='1' then cnt_unit := cnt_unit+'1'; if cnt_unit = "1010" then cnt_unit := "0000"; cnt_zeci := cnt_zeci + '1'; if cnt_zeci = "1010" then cnt_zeci := "0000"; end if; end if; end if; end if; --actualizare semnale minute(3 downto 0) <= cnt_unit; minute(7 downto 4) <= cnt_zeci; end process; --afisare valori pe iesire decodor_sutimi_low : decod7seg port map (sutimi(3 downto 0),data_out(6 downto 0)); decodor_sutimi_high : decod7seg port map (sutimi(7 downto 4),data_out(13 downto 7)); decodor_secunde_low : decod7seg port map (secunde(3 downto 0),data_out(20 downto 14)); decodor_secunde_high : decod7seg port map (secunde(7 downto 4),data_out(27 downto 21)); decodor_minute_low : decod7seg port map (minute(3 downto 0),data_out(34 downto 28)); decodor_minute_high : decod7seg port map (minute(7 downto 4),data_out(41 downto 35)); end crono_a; Se va realiza implementarea pe macheta cu Spartan 3. Butoanele Start, stop i reset se vor asocia cu butoanele de pe macheta (SW_USER02), ieirea cu afiajul 7 segmente (DIG0...5SEG0...6) iar ceasul global cu intrarea de ceas care provine de la oscilatorul extern de 50MHz aflat pe pinul AA12. 4. Tem 1. S se descrie, utiliznd limbajul VHDL, o structur logic care poate efectua opera ii logice pentru dou numere pe 4 bi i: SI logic i SAU logic.

2. S se proiecteze un ceas. Ultimii doi digi i vor fi secunde, urmtorii minute i cei mai semnificativi ore. 3. Criterii de evaluare: Cerin e laborator

Tem

Laborator 3 Arhitecturi Hardware Reconfigurabile Proiectarea unor structuri hardware reconfigurabile dinamic. Circuitul PLA reconfigurabil Con inut laborator: 1. Obiectivul lucrrii. 2. No iuni teoretice: 3. 4. Cerin e laborator. 5. Tem. 1. Obiectivul lucrrii: n acest laborator se va prezenta unul din cele mai simple circuite reconfigurabile dinamic i anume automatul PLA reconfigurabil. Ca arhitectur, acesta este o matrice logic programabil cu trei straturi de por i logice: un strat inversor, unul de por i SI i ultimul de por i SAU. n plus, interconexiunile dintre straturi se realizeaz prin intermediul unor multiplexoare. Intrrile de selec ie ale acestora stabilesc dac o interconexiune este sau nu realizat. n total se ob ine un ir de intrri de selec ie care constituie harta de configura ii a circuitului. Exemplele din acest laborator sunt numai de circuite combina ionale. Totui acest gen de circuit se poate utiliza i la implementarea de logic secven ial dac se adaug bistabili. Utilitatea laboratorului: Circuitul PLA este primul circuit din seria celor reconfigurabile dinamic. Ca structur intern este cel mai simplu dar poate fi utilizat n numeroase aplica ii n care se cere implementarea unor circuite de control a cror func ie de rspuns s fie variabil n timp. Avantajul acestuia este rapiditatea n (re) configurare. Dezavantajul este creterea dimensiunii cu numrul de intrri i ieiri. 2. No iuni teoretice Circuitul reconfigurabil min(max)termeni - Prima versiune de circuit reconfigurabil de tip PLA este mai apropiat de conceptul de sintez clasic, care reduce totul la ob inerea unor mintermeni sau maxtermeni. Structura este prezentat n figura 1. Aa cum este ilustrat n figur, func iile elementare e j ( x 1 , x 2 ,...x nj ) ale circuitului reconfigurabil sunt cunoscute i ntotdeauna aceleai, astfel nct s genereze o sum de produse logice. Acestea reprezint func iile elementare. Sarcina algoritmului genetic este aceea de a determina ruta optim (setul de conexiuni optime) pentru legtura ntre intrri (directe i negate) i stratul de por i SI. n figura 1 este prezentat varianta mintermeni, dar se poate uor modifica i pentru varianta maxtermeni cu aceleai cerin e. Pentru exemplificare i reprezentare, n figur s-a folosit o versiune simplificat de circuit logic care permite implementarea oricrei func ii cu trei intrri i o ieire.

Avantaje Aceast versiune de circuit reconfigurabil dinamic este practic cea mai simpla posibil. Algoritmul de reconfigurare utilizat are ca scop determinarea combina iei optime pentru ob inerea func iei obiectiv, prin configurarea strii conexiunii pentru fiecare poart SI la intrare. Convergen a este cea mai rapid, iar solu iile sunt cele mai apropiate de cele ob inute prin metodele de sintez clasice. Adncimea circuitului este dat de adncimea modulelor de reconfigurare conexiuni la care se adun 2 (re eaua SI i re eaua SAU).
e( x1, x 2, x 3)
j=1 c

Fig.1. Circuitul reconfigurabil mintermeni - pentru o func ie binar F(x1,x2,x3)=y

Dezavantaje Dup cum am artat, exemplul din figura 1 este pentru func ii logice cu 3 intrri i 1 ieire. n cazul n care se dorete implementarea unei func ii logice cu 2 ieiri dimensiunea circuitului se va dubla, deci i lungimea unui individ care codific strile conexiunilor la un moment dat. Un grup de tipul celui prezentat n figur, va avea pentru un numr de intrri egal cu i i numr de ieiri egal cu j urmtoarele caracteristici:

Tabelul 1. Dimensiunea circuitului reconfigurabil mintermeni - pentru i intrri i j ieiri Parametru Numr circuite configurare conexiuni Intrri circuite configurare conexiuni Ieiri circuite configurare conexiuni Por i strat SI Intrri por i strat SI Por i strat SAU Intrri por i strat SAU Dimensiune 2i j 2i I 2i j I J 2i

Cu alte cuvinte, o cretere a numrului de intrri ieiri conduce la o cretere exponen ial a dimensiunilor circuitului, dar adncimea rmne n principiu aceeai (binen eles de la un anumit numr de intrri pe o poart tehnologic devine imposibil de implementat i se lucreaz pe mai multe straturi aa cum s-a procedat cu poarta SAU din figura 1). Circuitul ca model reconfigurabil dinamic poate fi privit ca o re ea reconfigurabil dinamic unidimensional. Celulele de procesare sunt date aici de por ile logice, iar algoritmii de routare sunt determina i de evolu ia indivizilor. Optimizare Problema care se ridic la acest gen de circuit este urmtoarea: cum se poate optimiza structura pentru reducerea numrului de circuite? Rspunsul la ntrebare se poate da prsind complet orice analogie cu metodele clasice de sintez i trecnd pe un domeniu n care se vor utiliza algoritmi de reconfigurare de tipul celor de cutare i optimizare. n primul rnd, problema optimizrii se pune n situa ia n care se dorete implementarea unor func ii logice cu mai mult de o ieire. Pentru func ii logice cu numai o ieire, aa cum se va arta n capitolul urmtor, solu ia de mai sus rmne cea mai eficient. Dac

F( x 1 , x 2 ,...x n ) = ( y1 , y 2 ,...y m ) cu x i {0,1} , y j {0,1} atunci putem avea un set de m func ii, de forma urmtoare: F1 ( x 1 , x 2 ,...x n ) = y1 , F2 ( x 1 , x 2 ,...x n ) = y 2 ,..... Fm ( x 1 , x 2 ,...x n ) = y m . Fiecare func ie cu o ieire se poate reprezenta la rndul su folosind func ii elementare, cu o lege de compozi ie aa cum a fost explicat mai sus: F1 = f 11 o f 12 ..., F2 = f 21 o f 22 ..., ... Fm = f m1 o f m 2 ...

Se observ faptul c n situa ia n care:


f xi f yj , x y atunci apar func ii identice care se pot refolosi eficientiznd i optimiznd structura rezultat.

Circuitul reconfigurabil INV-AND-OR-

Problema determinrii func iilor sau grupurilor de func ii elementare care compun func iile binare cu o singur ieire este una abordabil prin . Pentru aceasta, circuitul reconfigurabil min(max)termeni - trebuie schimbat. Alturi de conexiunile configurabile aflate ntre stratul de intrare (format din intrri i nega ia lor) i stratul de por i AND (SI), sunt introduse conexiuni reconfigurabile i ntre stratul de por i AND (SI) i stratul de por i OR (SAU) aflate la ieire. n figura de mai jos este prezentat un exemplu de circuit reconfigurabil INV-AND-OR- care are 3 intrri i dou ieiri. Toate exemplele care sunt date aici sunt simplificate (numr de intrri i ieiri relativ mici), dar ele pot fi extinse pentru ob inerea unor rezultate semnificative. i la acest circuit func iile elementare sunt stabilite, avnd circuite elementare fixate. Spre deosebire de solu ia mintermeni - , aici avem un numr mai mare de configurri care se pot aplica circuitului pentru cele dou straturi. Viteza de convergen este mai mic dect la versiunea anterioar, deoarece alturi de determinarea termenilor de intrare n stratul SI sunt determina i i termenii de intrare n stratul SAU. Modelul este tot al unei re ele reconfigurabile dinamice unidimensionale deoarece putem vedea straturile de circuite configurare conexiuni ca fiind aezate ntr-o singur linie. Avantaje Solu ia prezentat este mult mai eficient din punct de vedere al spa iului ocupat fa de cea anterioar. Adncimea circuitului este dat de dimensiunea circuitelor de configurare pentru cele dou straturi plus 2. Pentru un circuit general cu i intrri i j ieiri avem urmtoarele: Tabelul 2. Dimensiunea circuitului reconfigurabil INV-AND-OR-
Parametru Numr circuite configurare conexiuni Dimensiune 2i + j 2i I 2i 2i 2i I J 2i

Intrri circuite configurare conexiuni 1 Ieiri circuite configurare conexiuni 1 Intrri circuite configurare conexiuni 2 Ieiri circuite configurare conexiuni 2 Por i strat SI Intrri por i strat SI Por i strat SAU Intrri por i strat SAU

1 e j ( x1, x 2, x3)
j=1

2 e j ( x1, x 2, x3)
j=1

F1 ( x 1 , x 2 , x 3 )

F2 ( x 1 , x 2 , x 3 )

Fig.2. Circuitul reconfigurabil INV-AND-OR-

Creterea numrului de intrri conduce la creterea exponen ial a numrului de circuite de configurare din primul strat i al numrului de por i SI. n schimb, creterea numrului de ieiri duce la o cretere liniar a numrului de por i logice SAU i al circuitelor logice de configurare n stratul SAU. Toate acestea, n condi iile n care adncimea circuitului rmne la fel. Dei dimensiunea hr ii de configurare (numrul de intrri de selec ie din multiplexoare) crete, lund n considerare i numrul de circuite de conectare din cel de-al doilea strat, totui, n cazul n care numrul de ieiri este mare, se ajunge la valori mai mici dect la varianta anterioar. Deci, dei a aprut un strat suplimentar de circuite de configurare (ntre stratul de por i SI i stratul de por i SAU), dimensiunea circuitului variaz liniar cu numrul de ieiri. n aceast situa ie, aa cum se va arta n capitolul urmtor, pentru un anumit numr de ieiri dimensiunea circuitului este semnificativ mai mic fa de varianta anterioar.

Dezavantaje Un prim dezavantaj pe care l-am men ionat consta n creterea complexit ii circuitului pentru un numr mic de ieiri. Efectul apare n creterea dimensiunii hr ii de configurare, fapt care i va pune amprenta n creterea timpului de convergen al algoritmului de reconfigurare. n al doilea rnd, dei problematica sintezei s-a deprtat de solu iile clasice prin determinarea mintermenilor, dar i prin determinarea func iilor elementare componente comune, ea rmne tributar modului de proiectare clasic prin descrierea unor circuite ca sume de mintermeni sau produse de max termeni. Algoritmii moderni de reconfigurare sunt privi i ca o metod de exploatare a spa iilor de proiectare inaccesibile prim metodele conven ionale de proiectare i care pot aduce rezultate superioare. ns pentru a permite acest lucru, trebuie ndeprtate orice restric ii rezidente din conceptul de sintez clasic ceea ce duce la exploatarea algoritmul genetic la ntreaga lui putere de algoritm de cutare n spa iul de solu ii a circuitelor. Pentru asta se pune problema generrii unor circuite care nu au aceeai adncime i nu au aceleai celule elementare. Optimizare Toate valorile specificate n tabelul 2 sunt date n condi iile n care se dorete descrierea circuitelor folosind func ii elementare utilizate i n proiectarea clasic a circuitelor, dar pot fi totui modificate. De exemplu, se poate concepe un circuit care s nu aib numai 3 straturi, ci s aib 4 straturi de por i. Mrirea numrului de straturi ar reprezenta binen eles o supraevaluare a circuitului, dar aceasta se poate corecta prin introducerea unui numr mai mic de intrri pentru fiecare poart din strat. Cu alte cuvinte se poate decide la o cretere n adncime i la o scdere n l ime a circuitelor. Din acest punct de vedere se poate vorbi despre un numr de straturi, precum i despre un numr de circuite pe strat ca un set de parametri ai circuitului reconfigurabil, independent de numrul de intrri sau ieiri. Alturi de calculul regulilor de routare, optimizarea nseamn i configurarea func iilor logice elementare. Aceasta presupune ns proiectarea unor celule reconfigurabile care s permit aspectele precizate anterior. n al doilea rnd, se pune problema generrii unor circuite cu adncimi diferite, fapt care implic i refacerea modulului de routare. La cele dou modele de circuite reconfigurabile, sensul de routare era ntotdeauna de la intrare la ieire trecnd prin dou straturi de por i niciodat nu se putea evita trecerea printr-un strat sau altul. De aceea, toate circuitele generate cu primele dou metode au adncimi egale, fr s se ridice problema unei optimizri a circuitului generat n aceast direc ie.
Cerin e laborator:

Prezentare montaj experimental: n acest laborator se va construi o structur hardware reconfigurabil de tipul PLA care permite att sinteza circuitelor cu min termeni ct i cu max termeni. Func ia int va fi de forma F(x1,x2,x3) = y adic orice func ie logic ce are 3 intrri i o ieire.

Schema circuitului propus spre a fi realizat n laborator este prezentat n figura de mai jos:
Intrari configuratii provenite de la registrii harta confuguratii (17 intrari) Intrari generate de la un numarator la 1 secunda x2 x1 x0 Intrari configurare conexiuni: 3 intrari x 4 circuite conexiuni Intrari configurare porti strat 1: 1 intrare x 4 porti strat 1

Not x0 x0 Not x1 x1 Not x2 x2 Not x0 x0 Not x1 x1 Not x2 x2 Conexiuni poarta 2 Conexiuni poarta 1

x0out

x1out x2out

Poarta 1 SI/SAU

Iesire poarta 1 Intrare configurare poarta strat 2: 1 intrare x 1 poarta strat 2

x0out

x1out x2out

Poarta 2 SI/SAU

Iesire poarta 2

Poarta 5 SI/SAU Not x0 x0 Not x1 x1 Not x2 x2 Conexiuni poarta 3 x1out x2out Poarta 3 SI/SAU Iesire poarta 3 x0out

iesire

Not x0 x0 Not x1 x1 Not x2 x2 Conexiuni poarta 4

x0out

x1out x2out

Poarta 4 SI/SAU

Iesire poarta 4

Fig.3. Schema circuit reconfigurabil mintermeni - maxtermeni F(x1,x2,x3)=y

pentru o func ie binar

Schema o urmrete pe cea a circuitului reconfigurabil mintermeni - prezentat n figura 1, cu urmtoarele mbunt iri. n loc de por i logice fixe s-au adugat porti logice configurabile care permit selec ia func iei SI sau a func iei SAU. Astfel, stratul de por i SI si stratul de por i SAU pot fi acum interschimbate ceea ce permite implementarea att a descrierilor utiliznd mintermeni ct i a descrierilor care utilizeaz maxtermeni.

Din acest motiv, schema a fost mbunt it n sensul reducerii numrului de por i din stratul 1 la jumtate. Montajul experimental care se va implementa pe macheta de laborator va avea structura prezentat n figura 4.
Comutatoare 3 4 5 6 7 8

Date (6 biti) Clk reg1 Registru harta configurari 1

sw1

sw2

Clk reg2

Registru harta configurari 2

sw3

Clk reg3

Registru harta configurari 3

Clk (50MHz) sw6 Configurari (17 biti)

Divizor frecventa

Reset

x2 Circuit reconfigurabil dinamic y

Clk (1 Hz)

Numarator

x1

x0

ld ld ld 0 1 2

Fig.4. Montaj experimental pentru circuitul reconfigurabil Intrrile din circuitul reconfigurabil sunt generate cu ajutorul unui numrtor pe 3 bi i cu frecven a de 1 Hz. Astfel, vor fi parcurse toate strile pe intrare i se vor vedea toate valorile ieirii. Cele 17 intrri de configurare care sunt necesare pentru circuitul reconfigurabil vor fi generate n grupe de cte 6 de la comutatoare i vor fi stocate n regitri cu ncrcare paralel pe 6 bi i fiecare.

Harta configura iilor este dat n tabelele de mai jos: Tabelul 3: Registrul 1: 5 4 3 Conexiuni poarta 2 (0 notX, 1 X) X2out X1out X0out Registrul 2: 5 4 3 Conexiuni poarta 4 (0 notX, 1 X) X2out X1out X0out Registrul 3: 5 4

2 1 0 Conexiuni poarta 1 (0 notX, 1 X) X2out X1out X0out 2 1 0 Conexiuni poarta 3 (0 notX, 1 X) X2out X1out X0out 0 Poarta 1

3 2 1 Setri por i logice (0 SI, 1 SAU) Poarta 5 Poarta 4 Poarta 3 Poarta 2

Configura iile se introduc pe rnd n cei trei regitri, aa cum este prezentat mai sus, utiliznd magistrala de date de intrare comun conectat la comutatoarele de pe machet. Pentru nscrierea registrului se genereaz un semnal de ceas utiliznd butoanele de pe machet. Construirea montajului experimental pe machetele cu FPGA utiliznd VHDL Se va crea un proiect n ActiveHDL (pentru detalii revede i anexa laborator!). n proiect se vor crea urmtoarele fiiere VHDL (utiliznd Wizard): 1. Divizor.vhd n care se va descrie divizorul de frecven necesar pentru generarea semnalului de ceas cu frecven a de 1Hz Caracteristicile IO acestui circuit sunt urmtoarele:

U1
clk_in clk_out

divizor
Codul VHDL este urmtorul: library IEEE; use IEEE.STD_LOGIC_1164.all; entity divizor is

port( clk_in : in STD_LOGIC; clk_out : out STD_LOGIC ); end divizor; architecture divizor_a of divizor is begin process(clk_in) variable cnt_int : integer; begin if clk_in'event and clk_in='1' then if cnt_int < 50000000 then cnt_int := cnt_int + 1; clk_out <= '0'; else cnt_int := 0; clk_out <= '1'; end if; end if; end process; end divizor_a; 2. Numrtor.vhd n care se va descrie numrtorul pentru generarea intrrilor utilizat la evaluarea circuitului Caracteristicile IO ale circuitului sunt prezentate n figura de mai jos:

U2
clk reset q(2:0)

numarator
Codul n VHDL este: library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_UNSIGNED.all; entity numarator is

port( clk : in STD_LOGIC; reset : in STD_LOGIC; q : out STD_LOGIC_VECTOR(2 downto 0) ); end numarator; architecture numarator_a of numarator is begin process(clk,reset) variable cnt_int : std_logic_vector(2 downto 0); begin if clk'event and clk='1' then if reset = '0' then cnt_int := "000"; else cnt_int := cnt_int + '1'; end if; q <= cnt_int; end if; end process; end numarator_a;
3. Conexiune.vhd reprezint descrierea circuitului responsabil cu stabilirea conexiunilor ntre stratul de por i inversoare i primul strat de por i configurabile. Circuitul este compus din 3 multiplexoare 2:1, aa cum se poate vedea n descrierea VHDL

U3
a a_bar b b_bar c c_bar s(2:0) a_out b_out c_out

conexiune
Circuitul are 6 intrri, 3 selec ii i 3 ieiri. La fiecare ieire (a_out, b_out i c_out) se poate conecta una din cele dou intrri care con in n denumire prima liter (de ex. la a_out se poate conecta a sau a_bar). Pentru intrrile din grupul a este alocat intrarea de

selec ie s(0), pentru cele din grupul b intrarea de selec ie s(1) i pentru cele din grupul c intrarea de selec ie s(2). Dac intrarea de selec ie corespunztoare grupului este 0 logic atunci pe ieirea omolog este conectat intrarea cu termina ia _bar n timp ce dac pe selec ia corespunztoare grupului se afl 1 logic atunci se conecteaz intrarea fr termina ia _bar din grupul respectiv la ieirea grupului. De exemplu: pe ieirea a_out se conecteaz intrarea a dac s(0) este 1 logic sau intrarea a_bar dac s(0) este 0 logic. library IEEE; use IEEE.STD_LOGIC_1164.all; entity conexiune is port( a : in STD_LOGIC; a_bar : in STD_LOGIC; b : in STD_LOGIC; b_bar : in STD_LOGIC; c : in STD_LOGIC; c_bar : in STD_LOGIC; s : in std_logic_vector(2 downto 0); a_out : out STD_LOGIC; b_out : out STD_LOGIC; c_out : out STD_LOGIC ); end conexiune; architecture conexiune_a of conexiune is begin --multiplexorul care selecteaza prima intrare with s(0) select a_out <= a when '1', a_bar when others; --multiplexorul care selecteaza a doua intrare with s(1) select b_out <= b when '1', b_bar when others; --multiplexorul care selecteaza a treia intrare with s(2) select c_out <= c when '1', c_bar when others; end conexiune_a;

4. Poarta.vhd reprezint poarta configurabil din primul strat.

U4
intrari(2:0) iesire set

poarta
Aceasta este o func ie logic cu trei intrri i o ieire. Func ia logic este de tipul SI dac intrarea set este 0 logic i de tipul SAU dac intrarea set este 1 logic. Codul n VHDL pentru poarta cofigurabil este prezentat mai jos. Aa cum se poate observa, este constituit din dou por i logice: SI i SAU i dintr-un multiplexor 2:1. library IEEE; use IEEE.STD_LOGIC_1164.all; entity poarta is port( intrari : in STD_LOGIC_VECTOR(2 downto 0); set : in std_logic; iesire : out STD_LOGIC ); end poarta; architecture poarta_a of poarta is signal si_out, sau_out : std_logic; begin si_out <= intrari(0) and intrari(1) and intrari(2); sau_out <= intrari(0) or intrari(1) or intrari(2); with set select iesire <= sau_out when '1', si_out when others; end poarta_a; 5. Poarta2.vhd reprezint poarta configurabil din cel de-al doilea strat.

U5
intrari(3:0) iesire set

poarta2
Structura ei este similar cu cea din primul strat numai c func iile logice sunt cu 4 intrri i o ieire. Codul n VHDL este prezentat mai jos. library IEEE; use IEEE.STD_LOGIC_1164.all; entity poarta2 is port( set : in STD_LOGIC; intrari : in STD_LOGIC_VECTOR(3 downto 0); iesire : out STD_LOGIC ); end poarta2; architecture poarta2_a of poarta2 is signal si_out, sau_out: std_logic; begin si_out <= intrari(0) and intrari(1) and intrari(2) and intrari(3); sau_out <= intrari(0) or intrari(1) or intrari(2) or intrari(3); with set select iesire <= sau_out when '1', si_out when others; end poarta2_a; 6. Registru.vhd este descrierea registrului cu acces paralel pe 6 bi i utilizat pentru stocarea unei pr i din harta de configura ii.

U6
clk d(5:0) q(5:0)

registru
Codul n VHDL pentru acesta este prezentat n continuare: library IEEE; use IEEE.STD_LOGIC_1164.all; entity registru is port( clk : in STD_LOGIC; d : in STD_LOGIC_VECTOR(5 downto 0); q : out STD_LOGIC_VECTOR(5 downto 0) ); end registru; architecture registru_a of registru is begin process(clk,d) begin if clk'event and clk='1' then q <= d; end if; end process; end registru_a; 7. Reconfig1.vhd care con ine circuitul final (montaj experimental) Structura acestuia ca pini de intrare ieire este prezentat mai jos.

U7
clk x0 clk_reg1 x1 clk_reg2 x2 clk_reg3 date(5:0) reset y

reconfig1
Pinii aloca i la machet pentru intrrile i ieirile circuitului, n conformitate cu figura 4, vor fi urmtorii: Tabelul 4: Alocarea pinilor Pin logic circuit Denumire pin machet Clk Gclk Clk_reg1 Sw_user0 Clk_reg2 Sw_user1 Clk_reg3 Sw_user2 Date(0) Sw_dip7 Date(1) Sw_dip6 Date(2) Sw_dip5 Date(3) Sw_dip4 Date(4) Sw_dip3 Date(5) Sw_dip2 Reset Sw_user5 X0 Led2 X1 Led1 X2 Led0 Y Led7 Pinii vor fi introdui n utilitarul de asociere constrngeri PACE consultnd tabelul cu alocarea pinilor FPGA de la sfritul anexei. Descrierea n VHDL este prezentat n continuare: library IEEE; use IEEE.STD_LOGIC_1164.all; entity reconfig1 is

port( clk : in STD_LOGIC; clk_reg1 : in STD_LOGIC; clk_reg2 : in STD_LOGIC; clk_reg3 : in STD_LOGIC; reset : in STD_LOGIC; date : in STD_LOGIC_VECTOR(5 downto 0); x0 : out STD_LOGIC; x1 : out STD_LOGIC; x2 : out STD_LOGIC; y : out STD_LOGIC ); end reconfig1; architecture reconfig1_a of reconfig1 is --declaratii componente component divizor is port( clk_in : in STD_LOGIC; clk_out : out STD_LOGIC ); end component; component numarator is port( clk : in STD_LOGIC; reset : in STD_LOGIC; q : out STD_LOGIC_VECTOR(2 downto 0) ); end component; component conexiune is port( a : in STD_LOGIC; a_bar : in STD_LOGIC; b : in STD_LOGIC; b_bar : in STD_LOGIC; c : in STD_LOGIC; c_bar : in STD_LOGIC; s : in std_logic_vector(2 downto 0); a_out : out STD_LOGIC; b_out : out STD_LOGIC; c_out : out STD_LOGIC ); end component; component poarta is port( intrari : in STD_LOGIC_VECTOR(2 downto 0);

set : in std_logic; iesire : out STD_LOGIC ); end component; component poarta2 is port( set : in STD_LOGIC; intrari : in STD_LOGIC_VECTOR(3 downto 0); iesire : out STD_LOGIC ); end component; component registru is port( clk : in STD_LOGIC; d : in STD_LOGIC_VECTOR(5 downto 0); q : out STD_LOGIC_VECTOR(5 downto 0) ); end component; --declaratii semnale signal clk_num : std_logic; signal intrari : std_logic_vector(2 downto 0); signal not_intrari : std_logic_vector(2 downto 0); signal intrari_strat1 : std_logic_vector(11 downto 0); signal intrari_strat2 : std_logic_vector(3 downto 0); signal harta_configurari : std_logic_vector(16 downto 0); signal iesire_registrii : std_logic_vector(17 downto 0); begin cdivizor : divizor port map(clk,clk_num); cnumarator : numarator port map(clk_num,reset,intrari); not_intrari <= not intrari; --primul strat conexiuni gconexiune: for i in 0 to 3 generate cconexiune: conexiune port map(intrari(0),not_intrari(0),intrari(1),not_intrari(1),intrari(2),not_intrari(2),harta_config urari(i*3+2 downto i*3),intrari_strat1(i*3),intrari_strat1(i*3+1),intrari_strat1(i*3+2)); end generate; --primul strat porti gporti: for i in 0 to 3 generate cpoarta: poarta port map(intrari_strat1(i*3+2 downto i*3),harta_configurari(12+i),intrari_strat2(i)); end generate; --al doilea strat de porti cpoarta2: poarta2 port map(harta_configurari(16),intrari_strat2,y); --pentru afisare intrari

x0 <= intrari(0); x1 <= intrari(1); x2 <= intrari(2); --conectare harta configuratii la iesire registrilor harta_configurari <= iesire_registrii(16 downto 0); --registrii harta configuratii cregistru1 : registru port map(clk_reg1,date,iesire_registrii(5 downto 0)); cregistru2 : registru port map(clk_reg2,date,iesire_registrii(11 downto 6)); cregistru3 : registru port map(clk_reg3,date,iesire_registrii(17 downto 12)); end reconfig1_a; Dup realizarea descrierii se va implementa pe machet urmrind paii descrii n anex. La implementarea pe machet se va ine cont de faptul c to i regitrii au ini ial ncrcat valoarea 0. Aceasta este echivalent cu faptul c n circuitul reconfigurabil se afl la pornire implementat o func ie SI logic. Pentru implementarea unei func ii SAU logic cu trei intrri trebuie scrii to i regitrii de configurare cu valoarea 1 logic. n continuare se vor implementa alte func ii logice pentru a ilustra puterea de reconfigurare a circuitului. Probleme de rezolvat n laborator: 1. Pe baza descrierilor n VHDL s se deseneze schema circuitului Conexiune i a circuitului Poarta 2. S se implementeze pe circuitul reconfigurabil dinamic o poart XOR cu 3 intrri. Tabela de adevr a acesteia este urmtoarea: X2 0 0 0 0 1 1 1 1 X1 0 0 1 1 0 0 1 1 X0 0 1 0 1 0 1 0 1 Y 0 1 1 1 1 1 1 0

3. S se implementeze pe circuitul reconfigurabil dinamic un sumator cu 3 intrri. Tabela de adevr a acesteia este urmtoarea: X2 0 0 0 0 X1 0 0 1 1 X0 0 1 0 1 Y 0 1 1 0

1 1 1 1

0 0 1 1

0 1 0 1

1 0 0 1

4. S se implementeze pe circuitul reconfigurabil dinamic o func ie majoritar 1. Tabelul de adevr este: X2 0 0 0 0 1 1 1 1 X1 0 0 1 1 0 0 1 1 X0 0 1 0 1 0 1 0 1 Y 0 0 0 1 0 1 1 1

Tem

1. S se construiasc un circuit reconfigurabil de tip PLA pentru func ii F(x0,x1,x2) = y cu por ile configurabile care pot fi SI, SAU, SI-NU, SAUNU. Care este dimensiunea n bi i a har ii de configura ii? 2. S se construiasc un circuit reconfigurabil de tip PLA mintermeni - pentru func ii F(x0,x1,x2) = (y0,y1). Care este dimensiunea n bi i a hr ii de configura ii. 3. Ce modificri trebuie aduse circuitului realizat n acest laborator pentru ca la un moment dat s fie posibil comutarea de la o harta de configurri la alta prin apsarea unui buton. S se construiasc schema. 4. Un robot autonom primete informa ii din mediu pe 5 intrri i genereaz comenzi pe o 3 ieire digitale (n formatul totul sau nimic). S se construiasc un circuit reconfigurabil (de tipul PLA mintermeni - astfel nct de la momentul ini ializrii s efectueze opera ia de adunare . Din momentul n care a suma ob inut a depit valoarea 4 i va schimba func ia n majoritar 1, genernd pe toate cele trei ieiri rspunsul la func ia majoritar. Criterii de evaluare:
Cerin e laborator

Tem

Laborator 4 Arhitecturi Hardware Reconfigurabile Utilizarea primitivelor n VHDL. Memoria BlockRAM Coninut laborator: 1. Obiectivul lucrrii. 2. Noiuni teoretice: 3. Cerine laborator. 4. Tem. 1. Obiectivul lucrrii: n acest laborator se vor utiliza i alte resurse ale circuitelor reconfigurabile FPGA alturi de blocurile logice configurabile. Memoriile BRAM sunt memorii interne din FPGA care lucreaz la viteze foarte mari i permit stocarea unui volum mai mare de date. Ele au o organizare care poate fi configurat, putnd fi, opional, memorii uniport sau memorii biport. Alocarea acestor memorii nu are loc implicit ci numai prin utilizarea primitivelor, n care se specific n mod explicit configuraia memoriei. Primitivele sunt componente declarate de fabricanii circuitului i care sunt utilizate ca atare. n acest laborator se va implementa un sistem de afiare VGA care utilizeaz memoria BRAM pentru stocarea imaginii care se dorete afiat. Utilitatea laboratorului: Resursele accesibile prin primitive printre care se numr memoriile BRAM i administratorul de ceas, sunt utile n numeroase aplicaii. Acest laborator este dedicat n primul rnd modului n care se pot utiliza resursele suplimentare, prin declararea primitivelor, pe care le posed un circuit FPGA. Acestea n cazul n care nu sunt alocate rmn neutilizate, ele nu se vor alocat printr-o comand implicit. Deci un obiectiv suplimentar pe care i-l propune acest laborator este acela de a indica o metod optimizat de abordare a circuitelor reconfigurabile n sensul utilizrii corecte a resurselor de care dispun. 2. Noiuni teoretice Memoriile BlockRAM Alturi de memoria RAM distribuit care se poate obine din blocurile logice configurabile utiliznd perechile de slice-uri M circuitele FPGA posed i memorie RAM dedicat, intern, care se poate utiliza la aplicaii care solicit spaii de memorie onchip mari. Memoria Block Ram (BRAM) este o memorie de tipul SRAM care poate fi configurat s devin memorie uni port sau memorie biport, memorie de tipul ROM, memorie de tipul RAM sau FIFO, tabele de funcii extinse, bufferi circulari sau regitrii de deplasare. De asemenea se pot configura numrul de locaii i limea unei locaii (numrul de bii). n cazul familiei de FPGA-uri Spartan 3, exist blocuri de memorie de cte 18k din care 16k sunt alocai pentru stocarea datelor iar 2k pentru stocarea biilor de paritate. Biii de paritate nu sunt generai n vreun fel de logica intern existent n FPGA, ei pot fi utilizai tot ca bii de date aflai ns n locaii separate i acionabili pe magistrale separate. La circuitul Spartan3 XC3S400 de exemplu exist 16 memorii BRAM deci are o capacitate de stocare intern de 288kbii.

Fiecare memorie BRAM este una sincron configurabil biport sau cu un singur port, avnd structura prezentat mai jos. Acestea sunt amplasate fizic pe laturile circuitului FPGA aa cum se poate vedea n figur:

Fluxul de date difer, n funcie de modul n care memoria este configurat.

Memoriile biport exist n structura intern a FPGA-ului ca entiti distincte. Acestea pot fi apelate utiliznd modul de lucru cu primitive aa cum se procedeaz i cu administratorul de ceas. Modul n care o memorie biport este identificat este prezentat n figura de mai jos:

Fig.4.5. Memoria biport

Memoria biport este o structur care permite operarea simultan pe dou direcii (scris citit sau citit scris) a locaiilor care le deine. Fiecare locaie poate fi adresat, citit sau scris n acelai timp cu adresarea, citirea sau scrierea unei alte locaii. Orice operaie se desfoar sincron, deci n ritmul unui semnal de ceas. Memoria posed dou magistrale de adrese, pentru portul A i portul B, dou comenzi de activare, dou comenzi de validare scriere i dou comenzi de validare citire. De asemenea, fiecare port n parte va avea propria magistral de date, de intrare sau ieire. Circuitul Spartan 3 3s400fg456 posed 16 blocuri de memorie biport avnd fiecare a cte 16kb. Fiecare port n parte poate fi configurat pentru o dimensiune a magistralei de adrese i a magistralei de date dorit, conform tabelului de mai jos:

Tabela 4.1. Configuraii posibile la memoria biport Numr locaii 16k 8k 4k 2k 2k Dimensiune locaie (bii) 1 2 4 8 8+1(paritate)

1k 1k 512 512 256

16 16+2(paritate) 32 32+4(paritate) 72(numai un singur port)

Cu excepia ultimei linii toate celelalte combinaii pot fi utilizate pentru configurarea ambelor porturi n orice form. Aceast difereniere n configurarea porturilor este foarte avantajoas n cazul de fa. Spre exemplu, datele preluate de la cardul SD sunt transmise ctre memoria intern program sau obiecte imagine bit cu bit, datorit comunicaiei seriale. Pe de alt parte, din memoria de program procesorul grafic i preia datele instruciune cu instruciune, adic 16 bii ntr-un singur ceas. Dei este posibil orice combinaie de adrese/date i orice operaie pe un port la un moment dat, totui la un moment dat se poate opera o secven de scriere citire sau citire scriere simultan. De exemplu, dac se lucreaz cu un port n modul scriere atunci cu cellalt port se poate lucra n modul citire. Este valid i combinaia invers. ns dac, la un moment dat, se dorete utilizarea aceluiai port pentru scriere i pentru citire trebuie s se opteze pentru o configuraie uniport.

Alocarea unei memorii BRAM n limbajul VHDL se face prin declararea unei primitive n prezena librriei UNISIM.

library UNISIM; use UNISIM.VComponents.all;

component RAMB16_S1_S1

-- pragma translate_off generic ( -- "Read during Write" attribute for functional simulation WRITE_MODE_A : string := "READ_FIRST" ; -- WRITE_FIRST(default)/ READ_FIRST/ NO_CHANGE WRITE_MODE_B : string := "READ_FIRST" READ_FIRST/ NO_CHANGE -- RAM initialization ("0" by default) for functional simulation: see example ); -- pragma translate_on port ( DIA : in std_logic_vector (0 downto 0); -- WRITE_FIRST(default)/

ADDRA : in std_logic_vector (13 downto 0); ENA WEA : in std_logic; : in std_logic;

SSRA : in std_logic; CLKA DOA -DIB : in std_logic_vector (0 downto 0); : in std_logic; : out std_logic_vector (0 downto 0);

ADDRB : in std_logic_vector (13 downto 0); ENB WEB SSRB CLKB DOB ); end component; Alturi de porturi, n lucrul cu primitiva BRAM exist mai multe atribute de declarat. Numrul de porturi i organizarea. Aa cum s-a artat fiecare bloc de memorie BRAM poate fi configurat s lucreze uniport sau biport. Specificarea numrului : in std_logic; : in std_logic; : in std_logic; : in std_logic; : out std_logic_vector (0 downto 0)

de porturi se face n primitiv prin numele componentei. La Spartan 3 pentru memoria uniport declaraia componentei este prezentat n tabelul de mai jos:

Aa cum se poate observa, numele primitivei variaz cu organizarea memoriei uniport. La memoriile biport declaraiile variaz de asemenea cu organizarea memoriilor astfel:

Deci, prin numele primitivei se specific att organizarea ct i porturile pe care aceasta le are. De exemplu, declaraia component RAMB16_S1_S1 desemneaz o memorie biport, n care portul A i portul B au organizarea 16kx1. n cazul n care sunt utilizate dou porturi cu organizare diferit la o memorie biport, formulele de calcul care stabilesc o coresponden ntre adresele unui port i a celuilalt port sunt de felul urmtor:

Iniializarea coninutului. Implicit, memoriile sunt iniializate cu 0. Totui, numeroase aplicaii practice necesit utilizarea unei iniializri cu alte valori a coninutului memoriei. Pentru aceasta se utilizeaz atributul INIT_xx i INITP_xx pentru iniializarea coninutului de date sau de paritate.

Exist n total 64 de atribute INIT_xx care se pot iniializa, fiecare desemnnd un sector de 256 de bii din memorie. De exemplu: INIT_00 desemneaz sectorul care corespunde biilor 0 pn la 255, INIT_01 desemneaz sectorul care conine bitul 256 511 .a.m.d. Ultimul sector, accesat prin atributul INIT_3F, desemneaz ultimii 256 de bii din spaiul de date. Spre exemplu, dac se dorete ca primul octet din memorie s fie 00h n timp ce toi ceilali octei din primul sector s fie ffh atunci se scrie: attribute INIT_00 : string; attribute INIT_01 : string; attribute INIT_00 of bram0 : label is "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00"; attribute INIT_01 of bram0 : label is "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; --512

--256

Pentru zona de bii de paritate exist atributului INITP_xx care poate avea 8 valori: INITP_00 pn la INITP_07 fiecare reprezentnd de asemenea un sector de 256 de bii aflai n zona de paritate.

Cerine laborator: n acest laborator se va construi, utiliznd limbajul VHDL , un circuite care comand portul VGA de pe machet. Acesta va prelua o imagine, descris sub forma unui ir de pixeli, aflat n memora BRAM i o va transmite la un monitor prin interfaa VGA. Schema sistemului este prezentat n figura de mai jos. Schema este compus din dou module, corelate ntre ele. Unul este responsabil cu generarea semnalelor de sincronizare pe orizontal i pe vertical. Cele dou semnale care acest modul le va genera n final vor fi Vsinc i Hsinc. Cel de-al doilea modul este cel responsabil cu afiarea informaiilor propriu zise (de culoare). Pentru semnalele de sincronizare se ine cont de faptul c frecvena unui cadru trebuie s fie mai mare de 50Hz. n funcie de numrul de linii ales se obine i frecvena de comutare pe linii.

clk

HC 0 1589

VC 0 527

Inceput_linie

Hcnt (10..0)

Vcnt (9..0)

SYH 1305<hcnt<1494

SYV 494<vcnt<496

Hsinc Inceput_linie

Vsinc

Vsinc Hsinc Hcnt (10..0) Vcnt (9..0)

Divizor_linie %39

Clk_div

Numarator 00000(2) .. 11111(2)

Adresa(4..0)

Red_int (2..0) Memorie SRAM 2kx9 RAM16_S9 Green_int (2..0) Blue_int (2..0) Circuit de stingere Hcnt > 1248 Vcnt > 480

Red (2..0) Green (2..0) Blue (2..0)

Adresa(10..0) Vcnt Divizor_verticala %24 Numarator linii Adresa(10..5)

Clkh_div

Fig.1 Sistem de afiare utiliznd portul VGA cu memorie BRAM Modulul de afiare a informaiilor pe pixel se bazeaz pe o memorie BRAM uniport cu organizarea 2kx9. Justificarea alegerii acestei organizri este datorit faptului c, n final, trebuie generate 3 semnale de rou, verde i albastru pe 3 bii fiecare. Memoria BRAM este configurat, n acest caz, n forma 8 bii de date i 1 bit de paritate pe fiecare locaie. Distribuia informaiei de culoare este n felul urmtor:
Bit paritate b bb Biti date ggg rrr

Fig.2. Distribuia informaiei de culoare Deci scrierea unei locaii n memoria SRAM i a bitului de paritate care corespunde locaiei are drept efect programarea unui pixel. Fiecare linie a fost mprit n acest exemplu n 32 de pri care pot fi colorate n mod diferit n timp ce fiecare cadru (imagine complet) conine 20 de linii. Pentru aceasta au fost utilizate cele dou numrtoare i divizoarele de frecven care asigur semnalul de ceas ale acestora. La ieirea celor dou numrtoare va rezulta o adres fizic care va constitui adresa pixelului care se dorete afiat. Evident, ulterior se poate cu uurin extinde rezoluia pe orizontal sau pe vertical. Etape n construirea sistemului: 1. Se va crea un proiect n ActiveHDL, cu circuitul Spartan 3 asociat. (vezi anexa).

2. Se va crea un fiier VHDL (video1.vhd) n care se vor descrie toate modulele prezentate n schema din figura 1 dup cum urmeaz. Sistemul va avea structura la nivel de porturi prezentat n figura 3.

U1
clk blue(2:0) reset green(2:0) hsinc red(2:0) vsinc

video1
Fig.3. Pinii sistemului de afiare prin VGA realizat pentru macheta de laborator Pin Clk Reset Descriere Intrare. Semnal de ceas care realizeaz sincronizarea modulelor din sistem Intrare. Semnal prin care se realizeaz iniializarea modulelor componente ale sistemului de afiare Ieiri. Semnale digitale de culoare care apoi sunt convertite pe machet pentru a deveni semnale analogice prin care este comandat dispozitivul de afiare (monitorul) prin interfaa VGA Buffer. Semnal care realizeaz sincronizarea pe orizontal a imaginii. Deoarece acest semnal este utilizat i n alte blocuri se declar de tip buffer. Semnal care realizeaz sincronizarea pe vertical a imaginii

Red(2..0), Green(2..0), Blue(2..0)

Hsinc

Vsinc

a. Declararea primitivei pentru alocarea memoriei BRAM cu organizarea 2kx9 Se face imediat dup denumirea arhitecturii, n seciunea declarrii componentelor, nainte de begin:
--DECLARATIE COMPONENTE PRIMITIVE (MEMORIE BRAM CU ORGANIZAREA 1K X 8+1) component RAMB16_S9

-- pragma translate_off generic ( -- "Read during Write" attribute for functional simulation WRITE_MODE : string := "READ_FIRST" -- WRITE_FIRST(default)/ READ_FIRST/ NO_CHANGE -- RAM initialization ("0" by default) for functional simulation: see example ); -- pragma translate_on port ( DI : in std_logic_vector (7 downto 0); DIP : in std_logic_vector (0 downto 0); ADDR : in std_logic_vector (10 downto 0); EN : in std_logic; WE : in std_logic; SSR : in std_logic; CLK : in std_logic; DO : out std_logic_vector (7 downto 0); DOP : out std_logic_vector (0 downto 0) ); end component; --DECLARATIE ADTRIBUTE CARE SE VOR UTILIZA APOI attribute INIT_00 : string; attribute INIT_01 : string; attribute INIT_02 : string; attribute INIT_03 : string; attribute INIT_04 : string; attribute INIT_05 : string; attribute INIT_06 : string; attribute INIT_07 : string; attribute INIT_08 : string; attribute INIT_09 : string; attribute INIT_0a : string; attribute INIT_0b : string; attribute INIT_0c : string; attribute INIT_0d : string; attribute INIT_0e : string; attribute INIT_0f : string; attribute INIT_10 : string; attribute INIT_11 : string; attribute INIT_12 : string; attribute INIT_13 : string; attribute INITP_00 :string; attribute INITP_01 :string; attribute INITP_02 :string; attribute INITP_03 :string; attribute INITP_04 :string; attribute INITP_05 :string; attribute INITP_06 :string; attribute INITP_07 :string; --INITIALIZARE CONTINUT MEMORIE BRAM attribute INIT_00 of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_01 of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_02 of bram_img : label is

"38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_03 of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_04 of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_05 of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_06 of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_07 of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_08 of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_09 of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_0A of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_0B of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_0C of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_0D of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_0E of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_0F of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_10 of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_11 of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_12 of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INIT_13 of bram_img : label is "38383838C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738383838"; attribute INITP_00 of bram_img : label is "0482125205def74e0000000012ba4a4c12a8aa521aa8ab5216a8aad21298aa52"; attribute INITP_01 of bram_img : label is "142108421c2109ce242108423def7bde00000000049ef24204901242049e724e"; attribute INITP_02 of bram_img : label is "0000000000000000000000000000000000000000000000000000000025ef7bc2"; attribute INITP_03 of bram_img : label is "0000000000000000000000000000000000000000000000000000000000000000"; attribute INITP_04 of bram_img : label is "0000000000000000000000000000000000000000000000000000000000000000"; attribute INITP_05 of bram_img : label is "0000000000000000000000000000000000000000000000000000000000000000"; attribute INITP_06 of bram_img : label is "0000000000000000000000000000000000000000000000000000000000000000"; attribute INITP_07 of bram_img : label is "0000000000000000000000000000000000000000000000000000000000000000";

O primitiv, n acest caz RAMB16_S9, se declar ntocmai ca o component obinuit, numai c numele acesteia precum i toate obiectele care le are asociate (porturi, variabile generice, atribute) trebuie s aib exact numele specificate n documentaie.

Aa cum s-a prezentat n breviarul teoretic, alturi de pinii de port, exist i alte elemente importante n componenta BRAM. n exemplu de fa o component important o constituie atributele INIT_xx i INITP_xx care indic valoarea iniial pentru date i bii de paritate care exist n memorie. Prin aceste atribute se nscrie n memorie imaginea care se dorete afiat n cazul nostru. Formatul acesteia respect distribuia culorii din figura 2. n zona memoriei alocat datelor se afl informaia de rou, de verde i doi bii din informaia de albastru. Cel de-al treilea bit de albastru se afl n zona biilor de paritate (iniializat cu INITP_xx). n cazul nostru s-a dorit afiarea pe un fundal constituit dintr-un chenar de culoare verde i un fond mov (rosu cu albastru) a unui mesaj scris. Pentru un efect de transparenta la scris s-a utilizat un fond constituit din rosu i albastru nesaturat (valoarea 011). Scrisul propriu zis s-a realizat prin setarea bitului cel mai semnificativ al informaiei de albastru care a dus la saturarea pe fond i la adugarea unei nuane de albastru pe chenar. Astfel, pixelii care s-au dorit scrii au fost setai n 1 logic n zona de paritate a memoriei, acolo unde se afl bitul cel mai semnificativ de albastru. b. Declararea semnalelor care se utilizeaz n sistem n conformitate cu figura 1, se declar urmtoarele semnale (nainte de begin la arhitectur)
--DECLARATIE SEMNALE signal hcnt : std_logic_vector(10 downto 0); signal vcnt : std_logic_vector(9 downto 0); signal red_int : std_logic_vector(2 downto 0); signal green_int : std_logic_vector(2 downto 0); signal blue_int : std_logic_vector(2 downto 0); signal adresa : std_logic_vector(10 downto 0); signal clk_div : std_logic; signal clkh_div : std_logic; signal data_out : std_logic_vector(7 downto 0); signal datap_out : std_logic_vector(0 downto 0); signal inceput_linie : std_logic;

Acestea se utilizeaz pentru interconectarea modulelor din sistem. Urmtoarele module se introduc n interiorul arhitecturii. c. Descrierea numrtorului de sincronizare pe orizontal Modulul reprezentat cu HC (Horizontal Counter) n figura 1 este de fapt un numrtor care, n ritmul semnalului de ceas de 50MHz numr pentru obinerea a 1589 de puncte pe orizontal. Precizm c circuitul este conceput s funcioneze att pe monitoarele LCD noi dar i pe mai vechile monitoare cu CRT. Din acest motiv anumite elemente legate de afiare pe CRT au fost pstrate.

Trebuie precizat c nu toate punctele sunt informaie afiabil. O parte din acestea sunt utilizate pentru cursa invers pe orizontal. Pe durata cursei inverse pe orizontal nu trebuie afiat informaia pe ecran.
hc:process (clk,reset) begin if reset ='0' then hcnt <= "00000000000"; inceput_linie <= '0'; elsif clk'event and clk = '1' then if hcnt < 1589 then hcnt <= hcnt + 1; inceput_linie <= '0'; else hcnt <= "00000000000"; inceput_linie <= '1'; end if; end if; end process;

Din punct de vedere al descrierii n VHDL, numrtorul de pixeli pe orizontal este descris ca un numrtor pn la 1589 cu reluarea numrrii. Semnalul nceput_linie joac rol de indicator rencrcare. Reset-ul este unul asincron. d. Descrierea numrtorul de sincronizare pe vertical Numrtorul de sincronizare pe vertical (VC - Vertical Counter) are o structur similar cu numrtorul de pixeli.
vc:process (hsinc,reset) begin if reset ='0' then vcnt <= "0000000000"; elsif hsinc'event and hsinc = '1' then if vcnt < 527 then vcnt <= vcnt + 1; else vcnt <= "0000000000"; end if; end if; end process;

Semnalul n ritmul cruia se realizeaz numrarea este chiar ieirea hsinc. e. Descrierea modulului care asigur generarea semnalului de sincronizare pe orizontal hsinc Modului testeaz starea semnalului hcnt, obinut de la numrtorul de sincronizare pe orizontal. Dac acesta a ajuns la valoarea 1305 atunci semnalul de sincronizare pe orizontal este trecut n 0 logic. Acesta indic practic sfritul unei linii. Perioada acestuia este de fapt perioada de comutare a unei linii.

syh: process (clk,reset) begin if reset = '0' then hsinc <= '1'; elsif clk'event and clk = '1' then if hcnt>1305 and hcnt<1494 then hsinc <= '0'; else hsinc <= '1'; end if; end if; end process; Din motive legate de compatibilitatea cu toate tipurile de dispozitive de afiare, semnalul de sincronizare pe orizontal nu este inut n 0 logic pn la sfritul complet al numrrii punctelor pe linie. f. Descrierea modului care asigur semnalul vsinc de sincronizare a cadrelor Perioada unui cadru este dat de semnalul Vsinc. Acesta este generat ntr-un modul care face testul semnalului vcnt i vede cnd numrarea acestuia se apropie de sfrit. n acel moment d semnalul vsinc n 0 logic.
syv: process (hsinc,reset) begin if reset = '0' then vsinc <= '1'; elsif hsinc'event and hsinc = '1' then if vcnt>494 and vcnt<496 then vsinc <= '0'; else vsinc <= '1'; end if; end if; end process;

g. Descrierea circuitului de stingere Circuitul de stingere urmrete starea semnalelor hcnt i vcnt generate de numrtorul de sincronizare pe orizontal i de numrtorul de sincronizare pe vertical. Atunci cnd valoarea acestora ajunge aproape de sfrit nseamn c apare o curs invers, pe orizontal sau pe vertical. Pe durata curselor inverse semnalul video pe ieire trebuie stins adic s aib valoarea care corespunde culorii negru.
--CIRCUITUL DE STINGERE red <= "000" when (hcnt > 1248 or vcnt > 480 ) else red_int; green <= "000" when (hcnt > 1248 or vcnt > 480 ) else green_int; blue <= "000" when (hcnt > 1248 or vcnt > 480 ) else blue_int;

h. Descrierea memoriei care conine imaginea (memoria SRAM) Dup iniializarea atributelor componentei BRAM, care a avut loc n partea declarativ a componentei, este momentul apelrii componentei propriu zise.
----memoria BRAM bram_img: RAMB16_S9 port map ( DI => "11111111", DIP => "1", ADDR => adresa, EN => '1', WE => '0', SSR => '0', CLK => clk_div, DO => data_out, DOP => datap_out );

Aici sunt alocate semnalele pe porturile memoriei. Intrrile de date (DI i DIP) nu sunt utilizate deoarece memoria nu se va scrie niciodat prin secven de comand (se ncarc iniial cu valorile imaginii). Memoria este permanent activat (EN este 1) dar are scrierea permanent dezactivat (WE este 0). i. Descrierea numrtorului de adrese pe linie Asigur numrarea pixelilor logici (cei care sunt diferii n funcie de informaia care o pot conine). Pe o linie avem un total de 32 de pixeli logici n acest exemplu.
numarator: process(clk_div, inceput_linie) variable adr_int : std_logic_vector(4 downto 0); begin if inceput_linie = '1' then adr_int := "00000"; else if clk_div'event and clk_div = '0' then adr_int := adr_int + '1'; end if; end if; adresa(4 downto 0) <= adr_int; end process;

Fiecare pixel logic are n memoria BRAM o zon (8 bii de date i bitul de paritate al 9lea) n care se va afla informaia de culoare a acestuia. j. Descrierea numrtorului de adrese pe linii Numrtorul de adrese pe linii are rol n contorizarea liniilor i generarea adreselor care vor fi accesate din memoria BRAM. Alturi de numrtorul de adrese pe linie, acesta va genera la ieire informaia de adres fizic. Ieirea din numrtorul de puncte pe linie se concateneaz cu cea a numrtorului de adrese pe linii.

numarator_linii : process(clkh_div, vcnt) variable adr_int : std_logic_vector(5 downto 0); begin if vcnt= "0000000000" then adr_int := "000000"; else if clkh_div'event and clkh_div='1' then adr_int := adr_int + '1'; end if; end if; adresa(10 downto 5) <= adr_int; end process;

k. Descrierea divizorului de ceas pentru numrtorul de adrese pe linie Pixelii fizici care se pot afia pe o linie se mpart la pixelii logici i anume informaia distinct, care se va afia pe o linie. n cazul de fa, raportul este de 1:39. Pentru a obine acest raport s-a constituit un divizor al semnalului de ceas care va ajunge apoi n numrtorul de adrese pe linie.
divizor_linie : process(clk,inceput_linie) variable cnt_int : integer; begin if clk'event and clk='0' then if inceput_linie = '1' then cnt_int := 0; clk_div <= '0'; else cnt_int := cnt_int + 1; if cnt_int = 39 then cnt_int := 0; clk_div <= '1'; else clk_div <= '0'; end if; end if; end if; end process;

l. Descrierea divizorului pentru numrtorul de adrese pe linii Dei numrul de linii distincte posibile care s-au obinut este de 640 pe un cadru, n acest exemplu vor fi 20 de linii distincte care se pot afia i care pot conine informaie diferit. Din acest motiv, pentru acoperirea raportului de 1:32 s-a realizat un divizor al semnalului de ceas pentru numrtorul de adrese pe linii.
divizor_verticala : process(inceput_linie,vcnt) variable cnt_int : integer; begin if vcnt= "0000000000" then cnt_int := 0;

clkh_div <= '0'; else if inceput_linie'event and inceput_linie = '1' then cnt_int := cnt_int + 1; if cnt_int = 24 then cnt_int := 0; clkh_div <= '1'; else clkh_div <= '0'; end if; end if; end if; end process;

m. Conectarea semnalelor pe ieirile de culoare digital Cele trei semnale de ieire de culoare digital provin de la ieirile memoriei BRAM. Ieirea de date a memoriei (data_out) conine informaii despre informaia de culoare pentru rou (bitul 2..0), pentru verde (bitul 2..0) i parial pentru albastru (1..0). Bitul de paritate de pe ieire (datap_out) conine informaia de saturaie pentru albastru (bitul cel mai semnificativ din informaia digital de albastru).
red_int <= data_out(2 downto 0); green_int <= data_out(5 downto 3); blue_int(1 downto 0) <= data_out(7 downto 6); blue_int(2) <= datap_out(0);

n. Implementarea sistemului Dup descrierea sistemului se efectueaz sinteza i implementarea acestuia (vezi anexa). Pentru implementare trebuie alocate constrngerile legate de pinii fizici din FPGA care sunt conectai la portul VGA, la semnalul de ceas global i la butonul de reset. Pentru aceasta se urmrete fiierul de constrngeri de mai jos:

NET "blue<0>" LOC = "c13" ; NET "blue<1>" LOC = "a13" ; NET "blue<2>" LOC = "e14" ; NET "clk" LOC = "aa12" ; NET "green<0>" LOC = "d10" ; NET "green<1>" LOC = "c11" ; NET "green<2>" LOC = "e11" ; NET "hsinc" LOC = "a8" ; NET "red<0>" LOC = "d9" ; NET "red<1>" LOC = "d7" ; NET "red<2>" LOC = "d6" ; NET "reset" LOC = "y17" ; NET "vsinc" LOC = "b14" ;

Dup implementare se vor obine diferite combinaii de culori i se va schimba mesajul. Tem 1. S se identifice toate componentele prezentate i modul n care acestea au fost descrise n VHDL. S se traseze o schem detaliat a sistemului. 2. S se afieze textul avnd o nuan de rou saturat pe un fundal din verde cu chenar albastru. 3. S se descrie un sistem capabil s afieze la o rezoluie 800x600. Care este dimensiunea care trebuie alocat memoriei BRAM n acest caz. 4. S se construiasc sistemul care s permit afiarea animat a dou cadre, ambele salvate n memoria BRAM Criterii de evaluare: Cerine laborator

Tem

Laborator 5 AHR AUTOMATUL DE COMAND I CONTROL CU MEMORIE ROM Con inut laborator: 1. Obiectivul lucrrii. 2. No iuni teoretice: 3. Cerin e laborator. 4. Tem. Obiectivul lucrrii: n acest laborator este tratat o aplica ie a memoriilor ROM i anume automatul programabil CROM. La baza acestuia st un circuit de memorie ROM i un numrtor de adrese cu incrementare. n plus, pot exista i circuite demultiplexoare pentru extinderea magistralei de comenzi dar i multiplexoare de teste. Automatul CROM st la baza unit ii de execu ie care exist ntr-un procesor. Cunoaterea acestuia este un prim pas n n elegerea mecanismului de execu ie a instruc iunilor i de efectuare a testelor i a salturilor n memoria de programe. Utilitatea laboratorului const n primul rnd n suportul tehnic pe care l aduce pentru n elegerea mecanismelor care au loc ntr-un procesor. Pe de alt parte, automatele CROM sunt utilizate n proiectarea cu circuite reconfigurabile, la construirea unor nuclee programabile, capabile s execute seturi secven iale de comenzi. No iuni teoretice: A. Memoriile ROM n aplica ii n lucrul cu memoriile ROM se disting trei etape distincte: programarea memoriei, tergerea memoriei i citirea memoriei. ntr-o aplica ie o memorie ROM este vzut ca un circuit de memorare care permite numai citirea acestuia. ns, pentru a putea folosi o memorie ROM ea trebuie ini ial programat, adic scris cu secven a de date dorit. Spre deosebire de clasa memoriilor RAM scrierea (programarea) memoriilor ROM este o etap distinct de cea de func ionare normal. Regimurile de lucru sunt prezentate n figura 1. Pentru reprogramarea memoriilor din clasa ROM este necesar efectuarea unei opera ii suplimentare care presupune tergerea vechiului con inut. tergerea reprezint de asemenea un regim de lucru special de func ionare. a. Regimul de programare (scriere) al memoriei Programarea memoriilor ROM este o etap de lucru distinct n lucrul cu memoriile ROM. Programarea se poate efectua numai la o loca ie (sau bloc de loca ii) goal din memorie. O loca ie se consider goal dac to i bi ii din ea sunt n 1 logic (de ex. o loca ie pe un octet goal este FFh). n func ie de tipul memoriei ROM aceasta presupune urmtoarele:

aplicarea unor tensiuni suplimentare, de regul de valori mai mari dect cele de operare n regim de lucru normal; aplicarea unor semnale de validare a programrii la aceleai valori de tensiune cu regimul normal de operare; aplicarea unor algoritmi care demareaz programarea memoriei, fr a fi necesar aplicarea unor tensiuni sau semnale de comand externe suplimentare.

Fig.1. Lucrul cu memoria ROM La prima grup memoria este organizat ca n figura de mai jos:

Fig.2. Memorii cu programarea prin aplicarea unor tensiuni de programare Programarea memoriei presupune existen a unor tensiuni de programare, mai mari dect tensiunea de lucru normal (Vcc). Pentru aplicarea acestor tensiuni sunt deci necesare surse de tensiune separate. Activarea programrii se face prin setarea semnalului WR. Din aceast categorie fac parte circuitele ROM de tip OTP (one time programming). La cea de-a doua grup memoria este organizat astfel:

Fig.3. Memorii cu programarea prin aplicarea unui semnal extern Aici programarea se face prin aplicarea, pe un pin al memoriei, al unui semnal de comand (WR), la tensiunea normal de operare a memoriei. n regimul normal de lucru acest semnal trebuie setat pe un nivel inactiv. Din aceast grup se fac parte memoriile EEPROM. Cea de-a treia categorie este n felul urmtor:

Fig. 4. Programarea memoriei cu algoritm de scriere Aceast a treia categorie presupune, pentru activarea programrii, plasarea unui algoritm de scriere, adic o anumit secven de adrese i date care va declana etapa de programare. La aceste circuite poate fi prezent, op ional, un semnal de activare a scrierii de tipul WR, extern. Din aceast a treia categorie fac parte memoriile FLASH. b. Regimul de tergere (scriere) al memoriei tergerea este o etap care presupune trecerea unui bit din 0 logic n 1 logic, cu alte cuvinte golirea unei loca ii de memorie. n func ie de capacitatea de tergere se ntlnesc urmtoarele tipuri de memorii ROM: - memorii ROM la care tergerea nu este posibil: memorii OTP (one time programming) sau memorii EPROM; - memorii la care tergerea se efectueaz prin plasarea memorie ntr-un cmp de radia ii ultra-violete memorii EPROM cu tergere prin ultraviolete;

memorii la care tergerea se efectueaz prin aplicarea unor semnale electrice pe pini speciali ai memoriei memorii EEPROM (memorii EPROM cu tergere electric); memorii la care tergerea se efectueaz prin aplicarea pe adrese i date a unor algoritmi speciali de tergere (secven e de adrese i date): memorii FLASH. c. Regimul normal de lucrul al memoriei ROM (citire)

Este regimul prin care se opereaz cel mai mult cu memoria ROM. Ea este vzuta practic ca un circuit care permite numai citirea loca iilor din memorie. Modul de lucru aici este unul similar cu cel efectuat la memoriile din clasa RAM la opera ia de citire. Toate celelalte semnale utilizate pentru programare i tergere sunt aduse la nivele inactive.

Fig.5. Memoria ROM utilizat n aplica ii Citirea con inutului se face prin aplicarea adresei i a semnalelor de comand (CE i OE) toate acestea la tensiunea de alimentare normal. Programarea i tergerea memoriilor se efectueaz, la toate tipurile de ROM unde sunt posibile, de un numr limitat de ori precizat n datele de catalog (variaz ntre 100 100000 n func ie de tehnologie). n acest laborator se va lucra cu o memorie ROM cu organizarea 256x8 (prezentat n laboratorul anterior), cu urmtoarele caracteristici: Circuitul rom256x8 este o memorie ROM de 256 de octe i. Memoria rom256x8: U6
adrese(7:0) date(7:0) cs oe

rom256x8 Fig.6. Memoria ROM 256x8

Are 256 loca ii pe 8 bi i fiecare. Intrri: Adrese(7..0) - intrare adrese 8 bi i;

CS intrare activ 0 logic. Activeaz ntreg circuitul. OE intrare activ 0 logic. Activeaz liniile de date. Ieiri: Date(7..0) ieire date - 8 bi i. Aa cum se poate observa, memoria ROM256x8 este proiectat ca o memorie accesibil numai opera iei de citire. Fiind vorba de o descriere n VHDL pentru implementarea pe machetele din laborator, nu sunt prezente semnalele de programare, ca la memoriile din clasa ROM reale. Etapele de programare i tergere a acestei memorii constau n modificarea codului VHDLn care este descris memoria i con inutul su. Listingul complet al programului VHDL care descrie comportamentul memoriei a fost prezentat n laboratorul anterior (laboratorul 3). B. Automatele programabile cu memorii ROM Una din utilizrile cel mai des ntlnite ale memoriei ROM este stocarea unor secven e de instruc iuni care apoi s fie rulate cu un montaj de genul celui din figura de mai jos:
interm(7) interm(6) interm(5) interm(4)

GND U1 clk
fcl fout

interm(7:4)

U2
clk reset cout(3:0)

U3
interm(3:0) interm(7:0)
adrese(7:0) date(7:0) cs oe

led(7:0)

divizor reset cs oe

numarator1

rom256x8

Fig. 8. Executarea automat a instruc iunilor dintr-un ROM prin parcurgerea adreselor Schema din figura 8 se bazeaz pe un circuit de memorie ROM i pe un circuit numrtor cu incrementare. Aa cum se poate observa, numrtorul are ieirile conectate la intrrile de adrese ale memoriei ROM. Astfel, n ritmul semnalului de ceas care l primete pe intrarea clk, acesta va incrementa valoarea adresei memoriei ROM avnd drept efect parcurgerea liniar a secven ei de comenzi care se afl stocat n memoria ROM la loca ii succesive. O prim condi ie ca sistemul din figura 8 s func ioneze este ca intrrile de comand CE i OE s fie activate. La resetare, ieirile numrtorului sunt puse n 0 logic. Deci i adresa pe care acesta o va accesa este 00h. Prin generarea unui front activ de ceas (front cresctor) ieirea numrtorului se va incrementa (se va aduna 1) prin urmare se va accesa urmtoarea adres. Deci, prin parcurgerea liniar a adreselor memoriei se pot genera, n ordine, comenzi n conformitate cu instruc iunile din memoria ROM.

Fig.9. Rspunsul circuitului cu memorie i numrtor Aa cum se poate observa n figura 9, atunci cnd CS i OE sunt active la ieirea memoriei ROM (led) se succed secven e de instruc iuni n ritmul unui semnal de ceas. Acestea pot fi folosite pentru comanda unor circuite externe. Executarea, instruc iune cu instruc iune, a secven elor de program este o caracteristic tipic sistemelor de calcul. Unitatea de execu ie dintr-un procesor are la baz acest ansamblu memorie de program - circuit numrtor de adrese. Structura hardware prezentat n figura 8 poate executa secven e de instruc iuni, cum ar fi de tipul celei de mai jos (exemplu n limbajul C): a=10; b=20; c=30; a++; b++; c++; s=a+b; s+=c; Acestea se numesc secven e de program liniare. n propor ie de 80% orice program (secven de instruc iuni) este constituit din secven e liniare. Totui, pe alocuri, programul con ine i instruc iuni decizionale i de salt (branch, jump) de tipul celor prezentate mai jos (exemple n limbajul C):

for(i=0;i<100;i++) { } if(a==b) { }

Prima execut un test al variabilei i i intr n bucl dac condi ia este fals iar cea de-a doua testeaz egalitatea ntre a i b i sare peste blocul de instruc iuni urmtoare daca condi ia este fals. La baza acestor instruc iuni stau testele i salturile n memoria de program. Deci, alturi de execu ia liniar, prin parcurgerea succesiv a loca iilor din memorie, un program mai efectueaz i salturi la adrese. Pentru implementarea unui automat care poate executa liniar instruc iuni dar poate i efectua salturi se folosete o schem de tipul celei din figura 10. Circuitul numarator2 este un numrtor pe 4 bi i cu rencrcare. Dac pe pinul load (activ 0 logic) se aplic un semnal 0 logic atunci datele de la intrarea cin se vor ncrca n numrtor i se vor regsi pe ieirea cout a acestuia. Pe intrrile circuitului multiplexor 4:1 se vor afla semnalele care comand intrarea load a numrtorului. Dac este selectat intrarea 0 atunci load va fi permanent n 1 logic deci orice salt n memoria de program este dezactivat. Aceasta este pozi ia pentru execu ia liniar a secven elor de instruc iuni, adic parcurgerea loca ie cu loca ie. Dac sunt selectate intrrile 1 sau 2 de la multiplexor atunci comanda load la numrtor este dat de starea pinilor de testare T1 sau T2. Dac valoarea care se afl pe aceste intrri este 0 logic atunci se efectueaz un salt n memoria de program, altfel se execut instruc iunea aflat la adresa urmtoare. Putem vorbi despre salturi condi ionate de valoarea intrrilor de test T1 sau T2. Dac este selectat intrarea 3 atunci comanda load va fi permanent 0 logic deci numrtorul va lucra n modul salt. Vorbim de un salt necondi ionat. Circuitul demultiplexor 1:4 asigur 4 func ii de comand distincte.
int(0) int(1) int(2) int(3)

VCC
test(0) test(1) test(2) test(3) test(3:0)

GND GND GND GND U2 U3


i(3:0) y s(1:0)

GND U1
int(3:0) int(7:0)
adrese(7:0) date(7:0) cs oe

U4
e y(3:0)

T1 T2

cin(3:0) cout(3:0)

clk reset

clk load reset

instr(5) instr(4)

F(3:0)

s0 s1

GND

mux4_1

numarator2

rom256x8 GND

dmux1_4
instr(7:0)

instr(7:6) instr(3:0)

Fig.10. Automatul de comand i control cu 4 func ii, 2 teste, 2 salturi condi ionate i un salt necondi ionat Instruc iunea care se afl n memoria ROM are urmtoarea configura ie: Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Selec ie test Selec ie func ie Adres de salt pentru test Pornind de la structura instruc iunii se definete urmtorul set de instruc iuni:

Cod binar Cod hexa 0000xxxx 00h 0001xxxx 10h 0010xxxx 20h 0011xxxx 30h 01xxaaaa 4(A) 10xxaaaa 8(A) 11xxaaaa C(A) x: dont care aaaa, A : adresa de salt pe 4 bi i Cerin e laborator:

Simbol F0 F1 F2 F3 T1? : A T2? : A :A

Explica ie Execut func ia F0 Execut func ia F1 Execut func ia F2 Execut func ia F3 Salt la adresa A (aaaa) dac T1 este 0 Salt la adresa A (aaaa) daca T2 este 0 Salt necondi ionat la adresa A (aaaa)

Probleme propuse 1. (implementare macheta) S se descrie n VHDL o memorie ROM avnd scris urmtoarea secven : (00) = 13h (la adresa 00 scrie valoarea 13h) (01) = 23h (02) = 20h (03) = 02h (04) = 78h. S se proiecteze apoi o structur care s permit citirea i afiarea loca iilor din memorie pe primii doi digi i de la macheta (ca n figura 11).
adr(7)

GND
adr(6)

U2
data(7:4)
cod_in(3:0) cod_7_out(6:0)

GND adri5 adri4 adri3 adri2 adri1 adri0 cs oe


adr(5) adr(4) adr(3) adr(2) adr(1) adr(0)

dig1(6:0)

data(7:0)

decod7seg U3
cod_in(3:0) cod_7_out(6:0)

U1
adr(7:0)
adrese(7:0) date(7:0) cs oe

data(3:0)

dig0(6:0)

decod7seg

rom256x8

Fig.11. Automatul de comand i control cu 4 func ii, 2 teste, 2 salturi condi ionate i un salt necondi ionat S se realizeze o secven care va citi memoria ROM i se vor constata datele programate. (se vor genera din comutatoare semnalele corespunztoare pentru pinii de adres, OE i CS).

Rezolvare - Se va crea un proiect n ActiveHDL. Se va crea un fiier rom256x8.vhd utiliznd Wizard. Se va scrie codul VHDL pentru memoria ROM256x8, cu structura prezentat n figura 6, insernd con inutul cerut. Fiierul rom256x8.vhd va con ine urmtorul pogram: library IEEE; use IEEE.STD_LOGIC_1164.all; entity rom256x8 is port( cs : in STD_LOGIC; oe : in STD_LOGIC; adrese : in STD_LOGIC_VECTOR(7 downto 0); date : out STD_LOGIC_VECTOR(7 downto 0) ); end rom256x8; architecture rom256x8_a of rom256x8 is signal data_in : std_logic_vector(7 downto 0); begin with adrese select data_in <= --aici urmeaza continutul memoriei ROM --data adresa X"13" when X"00", X"23" when X"01", X"20" when X"02", X"02" when X"03", X"78" when X"04", X"FF" when others; process(cs,oe,data_in) begin if cs='0' and oe = '0' then date <= data_in; else date <= "ZZZZZZZZ"; end if; end process; end rom256x8_a;

Se va crea un fiier vhdl, denumit decod7seg.vhd n care se va introduce codul pentru decodorul 7 segmente. Structura acestuia este prezentat n figura de mai jos:

U1
cod_in(3:0) cod_7_out(6:0)

decod7seg
Fig.12. Decodorul 7 segmente Codul VHDL care trebuie s se regseasc n fiier este prezentat mai jos: library IEEE; use IEEE.STD_LOGIC_1164.all; entity decod7seg is port( cod_in : in std_logic_vector(3 downto 0); cod_7_out : out std_logic_vector(6 downto 0) ); end decod7seg; architecture decod7seg_a of decod7seg is begin process(cod_in) begin case cod_in is when "0000" => cod_7_out<= "0111111"; when "0001" => cod_7_out <= "0000110"; when "0010" => cod_7_out <= "1011011"; when "0011" => cod_7_out <= "1001111"; when "0100" => cod_7_out <= "1100110"; when "0101" => cod_7_out <= "1101101"; when "0110" => cod_7_out <= "1111101"; when "0111" => cod_7_out <= "0000111"; when "1000" => cod_7_out <= "1111111"; when "1001" => cod_7_out <= "1101111"; when "1010" => cod_7_out <= "1110111"; when "1011" => cod_7_out <= "1111100"; when "1100" => cod_7_out <= "0111001"; when "1101" => cod_7_out <= "1011110"; when "1110" => cod_7_out <= "1111001"; when "1111" => cod_7_out <= "1110001"; when others => cod_7_out <= "0000000";

end case; end process; end decod7seg_a; - Pentru a putea realiza citirea i afiarea rezultatului se vor folosi dou decodoare BCD-7 segmente. Se va crea un fiier schematics (block diagram). Se vor utiliza cele dou componente descrise anterior (memoria ROM i decodorul 7 segmente). Conexiunea se componentelor se realizeaz ca in figura 11. Reamintim c pentru denumirea magistralelor sau liniilor se d dublu click pe magistrala respectiv linia care se dorete redenumit i se tasteaz denumirea. Pentru magistrale se specific dimensiunea iar pentru fire conectate la magistral se folosesc aceleai denumiri cu ale magistralei iar intre paranteze se specific numrul firului n magistral (vezi laboratoarele anterioare). Pentru implementare se vor urmri paii din anex. Distribuirea pinilor este specificat n tabelul de mai jos: Porturi Macheta Specificatii adri0 sw_dip0 Switch 1 ON = 0, OFF = 1 adri1 sw_dip1 Switch 2 ON = 0, OFF = 1 adri2 sw_dip2 Switch 3 ON = 0, OFF = 1 adri3 sw_dip3 Switch 4 ON = 0, OFF = 1 adri4 sw_dip4 Switch 5 ON = 0, OFF = 1 adri5 sw_dip5 Switch 6 ON = 0, OFF = 1 cs sw_dip6 Switch 7 ON = 0, OFF = 1 oe sw_dip7 Switch 8 ON = 0, OFF = 1 dig1(0) dig1_seg0 digit 1 segment 0 dig1(1) dig1_seg1 digit 1 segment 1 dig1(2) dig1_seg2 digit 1 segment 2 dig1(3) dig1_seg3 digit 1 segment 3 dig1(4) dig1_seg4 digit 1 segment 4 dig1(5) dig1_seg5 digit 1 segment 5 dig1(6) dig1_seg6 digit 1 segment 6 dig0(0) dig0_seg0 digit 0 segment 0 dig0(1) dig0_seg1 digit 0 segment 1 dig0(2) dig0_seg2 digit 0 segment 2 dig0(3) dig0_seg3 digit 0 segment 3 dig0(4) dig0_seg4 digit 0 segment 4 dig0(5) dig0_seg5 digit 0 segment 5 dig0(6) dig0_seg6 digit 0 segment 6

2. S se programeze o memorie ROM cu secven a urmtoare: (00) = 81h (01) = 42h

(02) = 24h (03) = 18h (04) = 24h (05) = 42h (06) = 81h (07) = c3h (08) = 66h (09) = 3ch (10) = 66h (11) = c3h (12) = e7h (13) = 7eh (14) = ffh (15) = 00h (16) = ffh S se realizeze apoi circuitul din figura 8 pentru executarea automat a instruc iunilor, pas cu pas. 1. Se va crea un proiect. Se va crea un fiier rom256x8.vhd n care se va descrie memoria ROM cu secven a cerut (se urmresc paii de la punctul anterior); 2. Se va crea un fiier vhdl pentru divizorul de ceas (divizor.vhd). Acesta va avea urmtoarea structur.

U2
fcl fout

divizor
Fig.13. Divizorul de frecven (1:50000000) Codul VHDL pentru divizorul de frecven este urmtorul: library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity divizor is Port( fcl : in std_logic; fout : out std_logic

); end divizor; architecture divizor_a of divizor is signal decnt : std_logic_vector(25 downto 0); signal fout_int : std_logic; begin deb : process (fcl) begin if fcl'event and fcl = '1' then if decnt < 50000000 then --constata divizare decnt <= decnt + '1'; fout_int <= '0'; else fout_int <= '1'; decnt <= "00000000000000000000000000"; end if; end if; end process; fout <= fout_int; end architecture; 3. Se va descrie un numrtor pe 4 bi i n fiierul numarator1.vhd. Structura acestuia este urmtoarea:

U3
clk reset cout(3:0)

numarator1
Fig.14. Numrtorul pe 4 bi i cu incrementare Codul VHDL este urmtorul: library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity numarator1 is Port(

clk : in std_logic; reset : in std_logic; cout : out std_logic_vector(3 downto 0) ); end numarator1;

architecture numarator1_a of numarator1 is begin deb : process (clk,reset) variable decnt : std_logic_vector(3 downto 0); begin if reset = '0' then decnt := "0000"; elsif clk'event and clk = '1' then decnt := decnt + 1; end if; cout <= decnt; end process;

end architecture; 4. Se va construi schema din figura 8. Se va compila i apoi se va implementa. Pentru implementare avem urmtoarele distribuiri ale pinilor: Pin logic clk Reset Cs Oe Led7..0 Pin machet Fclk Sw_user0 Sw_dip0 Sw_dip1 Led7..0

Tem 3. S se realizeze un automat de comand i control cu 4 func ii i 2 teste i s se implementeze pe el urmtoarea organigram:

Start

F1

F2

da

T1 = 0?

nu

F0

F0

F3

F2

Stop

1. Se construi un nou proiect. Se va descrie n VHDL o memorie ROM256x8 care are urmtorul con inut. Adresa 00 01 02 03 04 05 06 07 08 Opera ie F1 F2 T1? :06 F0 F2 :08 F0 F3 :00 Binar 00010000 00100000 01000110 00000000 00100000 11001000 00000000 00110000 11000000 Descriere Execut func ia F1 Execut func ia F2 Testeaz T1 dac e 0 salt la adresa 06h Execut func ia F0 Execut func ia F2 Salt necondi ionat la adresa 08h Execut func ia F0 Execut func ia F3 Salt la adresa 00h

Se va compila. Se va genera fiierul rom256x8.vhd. 2.Se vor crea fiiere vhd pentru urmtoarele componente:

Numrtorul 4 bi i cu rencrcare:

U2
cin(3:0) clk load reset cout(3:0)

numarator2
Fig.15. Componenta numrtor 4 bi i cu rencrcare Codul VHDL este urmtorul: library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity numarator2 is Port( clk : in std_logic; reset : in std_logic; load : in std_logic; cin : in std_logic_vector(3 downto 0); cout : out std_logic_vector(3 downto 0) ); end numarator2;

architecture numarator2_a of numarator2 is begin deb : process (clk,reset) variable decnt : std_logic_vector(3 downto 0); begin if reset = '0' then decnt := "0000"; elsif clk'event and clk = '1' then if load = '1' then decnt := decnt + 1; else decnt := cin; end if;

end if; cout <= decnt; end process; Multiplexor 4:1:

U3
i(3:0) s(1:0) y

mux4_1
Fig.16. Componenta MUX4:1 Codul VHDL pentru MUX4:1: library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity mux4_1 is port( s : in STD_LOGIC_vector(1 downto 0); i : in std_logic_vector(3 downto 0); y : out std_logic ); end mux4_1; architecture mux4_1_a of mux4_1 is begin process(s) begin case s is when "00" => y <= i(0); when "01" => y <= i(1); when "10" => y <= i(2); when "11" => y <= i(3); when others => y <= 'Z'; end case; end process;

end mux4_1_a; Componenta demultiplexor 1:4

U4
e s0 s1 y(3:0)

dmux1_4
Fig.17. Componenta DMUX1:4 Codul VHDL este: library IEEE; use IEEE.STD_LOGIC_1164.all; entity dmux1_4 is port( e : in STD_LOGIC; s1 : in STD_LOGIC; s0 : in STD_LOGIC; y : out STD_LOGIC_VECTOR(3 downto 0) ); end dmux1_4; architecture dmux1_4_a of dmux1_4 is signal sint : std_logic_vector(1 downto 0); begin sint(0)<=s0; sint(1)<=s1; process(e,sint) begin if e = '0' then case sint is when "00" => y <= "1110"; when "01" => y <= "1101"; when "10" => y <= "1011"; when "11" => y <= "0111"; when others => y <= "1111"; end case; else

y <= "1111"; end if; end process; end dmux1_4_a; 4. Se va crea schema din figura 10. Se va compila. Se va implementa La implementare avem: Pin logic Clk Reset T1 T2 F3..0 Pin machet Sw_user1 Sw_user0 Sw_dip0 Sw_dip1 Led3..0

4.Pinii date(2), date(3), date(4) i date (5) ale unui montaj de tipul celui din figura 8 sunt conecta i cu anodul unor LED-uri (ROSU, GALBEN, ALBASTRU, ALB). S se programeze memoria i s se genereze apoi semnalele care vor produce urmtoarele secven e: - ROSU, ROSU-GALBEN, ROSU-GALBEN-ALBASTRU, ALB; - ROSU, GALBEN, ALBASTRU, ALB; - ROSU-ALBASTRU, GALBEN-ALB. LED-urile sunt active (aprinse), dac pe anod se afl 1.

5. S se realizeze urmatoarea schem de circuit control acces prin card:

ROM Cod acces (Card)

Circuit validare acces

Acces

Ieirea Acces trebuie s fie 1 pentru ca accesul sa fie permis. Codurile de acces valide sunt urmtoarele: xx1x0010 cu x: 0 sau 1. Se cer: a) S se scrie in memorie 5 coduri distincte de acces la adresele 00, 45, 56, 67 i 78;

b) S se realizeze circuitul de validare acces i s se conecteze memoria realizat; c) S se genereze secven a care citete de la adresele respective. Se va verifica dac ieirea Acces se seteaz corespunztor.

Criterii de evaluare: 1 1P 2 2P 3 2P 4 2P 5 3P 6 3P

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