Sunteți pe pagina 1din 30

INTRODUCERE IN LIMBAJUL ABEL-HDL 1.

Limbaje de descriere hardware (HDL-Hardware Description language) Metodele tradi ionale de proiectare a unui sistem numeric (circuit logic) sunt cele bazate pe ecua iile booleene sau pe reprezentarea schematic . Orice circuit logic este alcatuit pan la urm dintr-un num r oarecare de por i si/sau circuite bistabile, care sunt blocurile func ionale de baz . Proiectarea se f cea in mod tradi ional pe baza ecua iilor boolene. Pentru a optimiza aceast metod s-au dezvoltat tehnici cum ar fi minimizarea ecua iilor, care permite utilizarea mai eficient a por ilor si circuitelor bistabile. Metoda ecua iilor boolene presupune scrierea practic a unei ecuatii, pentru fiecare circuit bistabil si pentru fiecare bloc de por i. Pentru un sistem secven ial num rul de ecua ii este cel putin egal cu cel al circuitelor bistabile(registrelor). Dac sistemul nostru are sute de circuite bistabile vom avea si sute de ecua ii. Astfel, desi teoretic orice sistem numeric poate fi descris pe baza ecua iilor boolene, aceasta descriere(ca metod ) este total nepractic daca avem zeci, sute sau mii de ecua ii. Metodele bazate pe reprezentarea schematic (Schematics) sunt metode care folosesc o reprezentare grafic a sistemului numeric si care realizeaz in acelasi timp o extindere a metodei ecua iilor boolene, prin utilizarea si a altor blocuri func ionale, mai complexe dect por ile si circuitele bistabile. Ele prezint avantajul ca permit o proiectare ierarhic si pun in eviden a mai bine rela iile care exist intre diversele blocuri func ionale. Mul i ani de zile aceste metode au fost considerate optime pentru reprezentarea unui sistem numeric. Odat cu cresterea complexit ii sistemelor reprezentate si ele au devenit nepractice. Se mai utilizeaz pentru sisteme de complexitate mic sau medie. Marele dezavantaj al metodelor tradi ionale de proiectare este c un sistem trebuie specificat ca o re ea de elemente interconectate. In realitate ins un sistem numeric este specificat prin comportarea (behaviour) sa in anumite circumstan e specificate. Proiectantul trebuie s ajung de la aceasta form de specificare la un set de ecua ii sau o reprezentare grafica. Acest pas important poate fi in intregime eliminat prin utilizarea unui limbaj de descriere hardware(HDL). Un alt dezavantaj al metodelor tradi ionale este modul in care este descris un sistem complex. Este greu s lucr m cu sute de ecua ii, dar este inc posibil. Un sistem ins , care ar fi descris prin mii de ecua ii, este practic inabordabil prin aceast metod . Mai mult, si o reprezentare schematic in care apar sute sau mii de blocuri func ionale devine de nein eles. O descriere din punct de vedere al comport rii sistemului poate fi insa automat convertit intr-un cod surs HDL, cod care este apoi implementat prin intermediul unor programe de sintez . Limbajul ABEL (Advanced Boolean Equation Language) este un limbaj evoluat care permite o descriere din punct de vedere comportamental a unui circuit logic. ABEL este de asemenea un limbaj din categoria limbajelor de descriere hardware (HDLHardware Description Language), dezvoltat la origine de firma Data I/O pentru programarea dispozitivelor logice programabile (PLD-Programmable Logic Devices). Exist i alte limbaje similare, foarte utilizate, cum ar fi VHDL sau Verilog. Comparativ cu acestea ABEL este mult mai simplu, dar VHDL sau Verilog sunt mai adecvate pentru descrierea unor sisteme complexe. ABEL este un limbaj HDL care poate fi utilizat pentru a descrie comportarea unui sistem sub mai multe forme, cum ar fi: ecua ii logice, tabele de adev r sau diagrame de stare, utiliznd instruc iuni similare cu cele din limbajul C. Un compilator ABEL permite i simularea func ional a sistemului folosind vectorii de test, precum i implementarea sa folosind un dispozitiv PLD incepand de la cele mai simple(PAL sau GAL) si terminand cu cele mai complexe (CPLD-Complex Programmable Logic Devices sau FPGA- Field programmable Gate Array).

2. Structura unui fi ier surs ABEL Un fi ier surs ABEL const din urm toarele elemente:

Antet(Header): Declara ii: Descrieri logice: [Vectori de test: End

incluznd Module, [ Options i Title ] Pin, Constant, Node, Sets, States, Library. Equations, Truth-table sau State_diagram Test_vectors ]

Cuvintele cheie ale limbajului (recunoscute de ABEL drept comenzi, directive, etc.) nu sunt dependente de tipul de liter folosit (mare sau mic) pe cnd identificatorii defini i de utilizator depind de tipul de liter !!. De exemplu MODULE este acela i lucru cu module, dar identificatorul out1 este diferit de Out1! O machet (template) tipic a unui modul surs ABEL este dat mai jos: module nume modul [title sir] [identificator_dispozitiv device tip_dispozitiv;] declaratii pini alte declaratii equations ecuatii [Test_Vectors] [vectori de test] end nume modul Cuvintele cheie utilizate de limbajul ABEL sunt date n continuare: CASE, DECLARATIONS, DEVICE, ELSE, ENABLE, END, ENDCASE, ENDWITH, EQUATIONS, FUNCTIONAL_BLOCK, FUSES, GOTO, IF, IN, INTERFACE(ntr-un modul top), INTERFACE(ntr-un submodul), ISTYPE, LIBRARY, MACRO, MODULE, NODE, PIN, PROPERTY, STATE(ca declara ie), STATE(n state_diagram), STATE_DIAGRAM, STATE_REGISTER, TEST_VECTORS, THEN, TITLE, TRACE, TRUTH_TABLE, TEST_VECTORS, WITH . Urm toarea surs ABEL este un exemplu de implementare a unui semisumator de un bit folosind un circuit PLD de tip PAL22V10: module primul_meu_circuit; title 'semisumator ' PAL200 device '22V10'; " pini intrare A, B pin 3, 5; " pini iesire SUM, Carry_out pin 15, 18 istype 'com'; equations SUM = (A & !B) # (!A & B) ; Carry_out = A & B; end primul_meu_circuit;

3. Declara ii Module: fiecare fi ier surs ncepe cu o astfel de instruc iune urmat de un nume al modulului (identificator). Proiectele mari pot con ine mai multe module, fiecare cu propriile declara ii title, equations, end, etc. Title: este op ional i poate fi folosit pentru identificarea proiectului. Numele trebuie s fie cuprins ntre ghilimele (simple). Linia respectiv este ignorat de compilator fiind util numai pentru documentare. ir: reprezint este o serie de caractere ASCII cuprinse ntre ghilimele simple ( ` ). irurile sunt folosite pentru instruc iunile TITLE, OPTIONS , precum i n declararea atributelor pentru pin i node. device: este o declara ie op ional i asociaz un identificator de dispozitiv cu un anume circuit PLD. Este de dorit evitarea utiliz rii acestei declara ii n fi ierul surs deoarece astfel se p streaz independen a proiectului de tipul de circuit. Atunci cnd se lucreaz cu un mediu de programare integrat declararea tipului de circuit se face la crearea proiectului, dar poate fi modificat oricnd i ulterior. comentarii: comentariile pot ap rea oriunde n fi ierul surs , ncep cu ghilimele duble ( ") i se termin fie tot cu ghilimele duble, fie la sfr itul liniei (care situa ie apare prima) . pin: prin aceste declara ii compilatorul asociaz numele simbolice cu conexiunile externe ale dispozitivului. Formatul este urm torul (pin_id - identificator pin): [!]pin_id pin [nr. sau cod pin]

[istype 'atribut'] ;

Se pot specifica mai mul i pini pe aceia i linie sursa: [!]pin_id , [!]pin_id, [!]pin_id pin [nr. pin, [nr. pin, [nr. pin]]] [istype 'atribut'];

Exemplu: IN1, IN2, A1 pin 2, 3, 4; OUT1 pin 9 istype 'reg'; ENABLE pin; !Chip_select pin 12 istype 'com'; !S0..!S6 pin istype 'com'; Nu este neap rat nevoie s specific m un num r de pin. Numerele de pin pot fi specificate i mai trziu, n faza de implementare a proiectului, utiliznd un fi ier de constrngeri utilizator (user constraint file), proiectul avnd astfel un caracter mai general i mai flexibil. ! indic un semnal activ n 0 -Low ( semnalul va fi inversat). istype este un atribut op ional; variante: 'com' pentru a indica natura combina ional a semnalului de ie ire sau 'reg' pentru un semnal de tip registru (memorat ntr-un bistabil). Acest atribut este folosit doar pentru pini de ie ire sau noduri interne (node). node: declara iile node (nod intern) au acela i format ca declara iile pin; fiind ns vorba de semnale interne care nu au ca echivalent o conexiune extern , num rul de pin lipse te. Exemplu: temp1 node [istype 'com'];

alte declara ii permit definirea unor constante, mul imi (sets), macro-uri sau expresii care pot simplifica programul. Declararea unei constante are urm torul format: id [, id],... = expresie [, expresie].. ; Exemple: A = 21; c = .C. ; x = .x. z = .Z. ; ADDR = [1,0,1,1]; LARGE = B & C; Data = [D3, D2, D1, D0]; Data = [D3..D0]; Ultimele dou declara ii sunt echivalente. Folosirea " .. " reprezint o modalitate comod de descriere a unui domeniu (range). Declara ia respectiv utilizeaz practic o nota ie vectorial : de fiecare dat cnd vom folosi Data ntr-o ecua ie ne vom referi de fapt la vectorul [D3,D2,D1,D0]. Constante speciale(predefinite) n ABEL se pot utiliza o serie de constante cu o semnifica ie special . Cele mai importante sunt : .C. , .c. descrie o tranzi ie complet a unui semnal de ceas folosit ca intrare (L,H,L; _|--|_ ) .X. , .x. descrie o valoare indiferent (dont care) .Z., .z. - descrie o valoare tri-state 4. Numere Numerele pot fi utilizate folosind patru baze de numera ie diferite: binar, octal, zecimal i hexazecimal. Baza implicit este zecimal (f r prefixare). Se utilizeaz urm toarele prefixe: Binar ^b Octal ^o Zecimal ^d (implicit) Hexazecimal ^h Exemple: 35 , ^h35 , ^b101, ^h4FFB 5. Mul imi (sets) O mul ime este o colec ie de semnale sau constante utilizate pentru a face referire la un grup de semnale folosind un singur nume. Utilizarea mul imilor simplific semnificativ opera iile logice: orice opera ie aplicat unei mul imi este aplicat de fapt fiec rui element al ei. O mul ime este descris printr-un ir de constante sau semnale, separate prin virgul sau operatorul domeniu ( .. ), ir cuprins obligatoriu ntre paranteze p trate [] . Exemple: [D0,D1,D2,D4,D5] [D0..D6] " domeniul poate fi enumerat cresc tor [b6..b0] " domeniul poate fi enumerat si descresc tor [D7..D15] [b1,b2,a0..a3] " un (sub)domeniu ntr-o mul ime mai mare [!S7..!S0] " domeniu descresc tor de semnale declarate active low (n 0)

Urm toarea declaratie nu este permis : [D0, X] , unde X este de asemenea o mul ime X = [X3..X0]; n schimb se poate scrie corect: [D0, X3..X0]; b. Opera ii cu mul imi Cea mai mare parte a opera iilor poate fi aplicat i unei mul imi, opera ia efectunduse asupra fiec rui element al mul imii. Opera iile se efectueaz conform priorit ii operatorilor, opera iile cu aceia i prioritate se efectueaz de la stnga la dreapta (dac nu exist paranteze). Exemplul 1: Semnale = [D2,D1,D0]; " declararea multimii Semnale Semnale = [1,0,1] & [0,1,1]; " rezulta Semnale = [0,0,1] Exemplul 2: [A,B] = C & D; este de fapt echivalent cu dou instruc iuni: A = C & D; B = C & D; Exemplul 3: [A1,B1] = [D1,D2] & [C3,C2]; este echivalent cu: [A1,B1] = [D1 & C3, D2 & C2]; astfel vom avea A1 = D1 & C3, si B1= D2 & C2. Exemplul 4: X & [A,B,C]; care este echivalent cu [X&A, X&B, X&C]; n cazul urm toarei expresii lucrurile stau pu in diferit: 2 & [A,B,C]; acum num rul zecimal "2" este convertit n reprezentare binar i completat cu zerouri dac este necesar (010). Astfel ecua ia de mai sus este echivalent cu: [0 & A, 1 & B, 0 & C]; Exemplul 5: A = [A2,A1,A0]; "declaratii de multimi B = [B2,B1,B0 ]; A # B; este echivalent cu [A2 # B2, A1 # B1, A0 # B0]; !A; este echivalent cu [!A2,!A1,!A0]; Exemplul 6: [b3,b2,b1,b0] = 2; " echivalent cu b3=0,b2=0,b1=1,b0=0. Exemplul 7: S presupunem c avem urm toarea ecua ie (pentru ie irea unui decodificator): Chip_Sel = !A7 & A6 & A5 & A4; Mai nti definim mul imea Adr : Adr = [A7,A6,A5,A4]; Ecua ia propriu-zis va fi: Chip_Sel = Adr == [0,1,1,1]; Care este echivalent cu: Chip_Sel = !A7 & A6 & A5 & A4; Dac A7=0, A6=1 , A5=1 si A4=1 expresia Adr ==[0,1,1,1] este adev rat (sau 1) i Chip_Sel va fi i el 1 (sau adev rat). Alt modalitate de a scrie aceia i ecua ie este:

Chip_Sel = Adr == 7; " 7 zecimal = 0111 binar. 6. Operatori Exist patru tipuri de operatori de baz : logici, aritmetici, rela ionali i de asignare. a. Operatori logici Setul implicit de operatori logici (la nivel de bit) este descris n tabelul de mai jos.. Folosind directiva @ALTERNATE se poate eventual comuta la un set alternativ de operatori logici. Operator (implicit) Descriere Operator alternativ ! NOT (complement fa de 1) / & AND * # OR + $ XOR ( or exclusiv ) :+: !$ XNOR ( nor exclusiv) :*: b. Operatori aritmetici n continuare sunt prezenta i operatorii aritmetici. Ultimii cinci operatori nu pot fi utiliza i cu operanzi de tip mul imi. Semnul - poate avea semnifica ii diferite: prezent ntre 2 operanzi are semnifica ia de sc dere (sau adunare complement fa de 2), dar prezent n fa a unui operand are semnifica ia de complement fa de 2. Operator Exemplu Descriere -D1 Complement fa de 2 (schimbare de semn) C1-C2 Sc dere + A+B Adunare Urm torii operatori nu sunt folosi i cu mul imi: * A*B nmul ire / A/B mp r ire ntreag f r semn % A%B Modulo: restul lui A/B << A<<B Deplasare A stnga cu B bi i >> A>>B Deplasare B dreapta cu B bi i

c. Operatori rela ionali Ace ti operatori produc valoarea boolean adev rat True (-1) sau fals False (0). Valoarea 1 n cod complement fa de 2 este reprezentat n binar avnd to i bi ii n 1 (de ex. dac operandul are 8 bi i : 1111 1111 ). Operator Exemplu Descriere == A==B sau 3==5 (false) Egal != A!=B sau 3 != 5 (true) Diferit < A<B sau 3 < 5 (true) Mai mic <= A<=B sau 3 <= 5 (true) Mai mic sau egal > A>B sau -1 > 5 (true) Mai mare >= A>=B sau !0 >= 5 (true) Mai mare sau egal Operatorii rela ionali sunt f r semn: !0 este complementul fa de 1 al lui 0 sau 11111111 (dac operandul are 8 bi i) care are valoarea 255 n reprezentare f r semn. Astfel !0 > 9 este adev rat. Din acela i motiv i expresia 1 >5 este adev rat . O expresie rela ional poate fi folosit i mpreun cu expresii numerice, ea fiind substituit cu 1 sau 0 func ie de rezultatul evalu rii. De exemplu avem expresia A = B !$ (C == D);

aici A va fi egal cu B dac C este egal cu D (adev rat sau 111 ; B XNOR 1 egal cu B) , altfel A va fi egal cu complementul lui B .

d. Operatori de asignare Ace ti operatori sunt folosi i n ecua ii pentru a asigna valoarea unei expresii unui semnal de ie ire sau unui nod intern. Exist dou tipuri de astfel de operatori: combina ionali i de tip registru. n cazul unui operator combina ional asignarea are loc imediat, f r nici o ntrziere. n cazul operatorului de tip registru asignarea are loc odat cu urm torul impuls de ceas al bistabilului asociat ie irii sau nodului intern. Un exemplu simplu de definire a unui bistabil ar fi : Q1 pin istype 'reg'; Q1 : = D; Prima instruc iune (declara ie) define te bistabilul Q1, iar a doua instruc iune (ecua ie) spune c ie irea bistabilului va lua valoarea intr rii D la urm toarea tranzi ie activ a semnalului de ceas. Operator Descriere = Asignare combina ional := Asignare de tip registru e. Prioritatea operatorilor(preceden a) Prioritatea operatorilor este dat n urm torul tabel , n ordine cresc toare de la 1 la 4. Operatorii cu aceia i prioritate sunt evalua i de la stnga la dreapta. Prioritate Operator Descriere 1 Negare 1 ! NOT 2 & AND 2 << deplasare stnga 2 >> deplasare dreapta 2 * nmul ire 2 / mp r ire f r semn 2 % modulo 3 + adunare 3 sc dere 3 # OR 3 $ XOR 3 !$ XNOR 4 == egal 4 != diferit 4 < mai mic 4 <= mai mic sau egal 4 > mai mare 4 >= mai mare sau egal 7. Descrierea logic Descrierea logic poate fi f cut cu ajutorul ecua iilor, tabelelor de adev r sau a diagramelor de stare.

a. Ecua ii ( equations ) Se utilizeaz cuvntul cheie equations pentru a ncepe descrierea logic . Expresiile pot con ine operatorii descri i anterior precum i instruc iunea "When-Then-Else". Instruc iunea "When-Then-Else" poate fi folosit n ecua ii pentru a descrie o func ie logic (ea se mai utilizeaz i n diagramele de stare pentru a descrie o succesiune de st ri).

Formatul instruc iunii "When-Then-Else" este urm torul : WHEN condi ie THEN element = expresie; ELSE ecua ie; sau WHEN condi ie THEN ecua ie; Exemple de ecua ii: SUM = (A & !B) # (!A & B) ; A0 := EN & !D1 & D3 & !D7; WHEN (A == B) THEN D1_out = A1; ELSE WHEN (A == C) THEN D1_out = A0; WHEN (A>B) THEN { X1 :=D1; X2 :=D2; } Se pot utiliza i acoladele { } pentru a grupa diverse sec iuni n blocuri. Textul dintr-un bloc poate avea una sau mai multe linii. Blocurile pot fi folosite n ecua ii, tabele de adev r sau directive. b. Tabele de adev r ( truth_table ) Cuvntul cheie este truth-table i sintaxa este: TRUTH_TABLE ( in_ids - > out_ids ) intr ri - > ie iri ; sau TRUTH_TABLE ( in_ids : > reg_ids ) intr ri : > ie iri_regi trii ; sau TRUTH_TABLE ( in_ids :> reg_ids -> out_ids ) intr ri :> ie iri_regi trii -> ie iri; n care "->" este folosit pentru ie iri combina ionale i " : >" pentru ie iri de tip registru, in_ids identificatori intrari , out_ids identificatori ie iri, reg_ids identificatori registrii.

Prima linie a unei tabele de adev r (ntre paranteze) define te intr rile i ie irile, iar urm toarele linii coresponden ele ntre valorile de intrare i cele de ie ire. Fiecare linie trebuie s se termine cu ; . Intr rile i ie irile pot fi semnale singulare sau mul imi. Cnd se utilizeaz mul imi se folose te nota ia normal pentru acestea (5). O valoare indiferent este reprezentat prin ".X." (o constant predefinit a limbajului ABEL). Examplul 1: descrierea unui semisumator TRUTH_TABLE ( [ A, B] -> [Sum, Carry_out] ) [ 0, 0 ] -> [0, 0 ] ; [ 0, 1 ] -> [1, 0 ] ; [ 1, 0 ] -> [1, 0 ] ; [ 1, 1 ] -> [1, 1 ] ; Dac vom defini o mul ime IN = [A,B]; i respectiv o mul ime OUT = [Sum, Carry_out]; tabela de adev r poate deveni mai simpl : TRUTH_TABLE (IN -> OUT ) 0 -> 0; 1 -> 2; 2 -> 2; 3 -> 3; Exemplul 2: Un XOR cu dou intr ri plus o intrare de activare, activ n 1 : TRUTH_TABLE ([EN, A, B] -> OUT ) [ 0, .X.,.X.] -> .X. ; [ 1, 0 , 0 ] -> 0 ; [ 1, 0 , 1 ] -> 1 ; [ 1, 1 , 0 ] -> 1 ; [ 1, 1 , 1 ] -> 0 ; Exemplul 3: Tabelele de adev r pot fi utilizate i pentru descrierea ma inilor secven iale, n cazul acestui exemplu fiind vorba de un num r tor binar sincron de 3 bi i, cu ie irea de transport OUT (generat n starea 111). Se utilizeaz 3 bistabili QA, QB si QC care vor fi i ie irile num r torului. MODULE CNT3; "declaratii CLOCK pin; " intrare ceas RESET pin; " intrare reset OUT pin istype 'com'; " iesire transport (combina ional) QC,QB,QA pin istype 'reg'; " iesiri numarator (tip registru, bistabili) [QC,QB,QA].CLK = CLOCK; "semnalul de ceas pentru bistabili [QC,QB,QA].AR = RESET; " reset asincron pentru aceiasi bistabili TRUTH_TABLE ( [QC, QB, QA] :> [QC,QB,QA] -> OUT) [000] :> [ 0 0 1 ] -> 0; [001] :> [ 0 1 0 ] -> 0; [010] :> [ 0 1 1 ] -> 0; [011] :> [ 1 0 0 ] -> 0; [100] :> [ 1 0 1 ] -> 0; [101] :> [ 1 1 0 ] -> 0;

[110] [111] END CNT3;

:> [ 1 1 1 ] :> [ 0 0 0 ]

-> 0; -> 1;

Observatie Pentru utilizarea extensiilor de tip .DOT (cum ar fi .CLK i .AR) vezi sec iunea 7d.

c. Diagrame de stare ( State_diagram ) Sec iunea State_diagram con ine descrierea logic a unui circuit sub forma unor diagrame de stare. n aceasta sec iune se utilizeaz instruc iunile: "Goto", "Case" si "With". De obicei n sec iunea de declara ii se declar (se utilizeaz ) nume simbolice pentru st ri, programul fiind astfel mai u or lizibil. Declararea se face cu urm toarea sintax (unde state_id identificator stare): state_id [, state_id ...] STATE ; Ca un exemplu avem : SREG = [Q1, Q2]; care asociaz numele simbolic SREG cu starea definit prin intermediul bistabililor Q1 si Q2 (cei doi bistabili alc tuiesc practic un registru de stare). Sintaxa este urm toarea: State_diagram registru_stare STATE valoare_stare : [ecuatie;] [ecuatie;] : : instructiune_tranzitie_stare ; ... Cuvntul cheie state_diagram indic nceputul unei descrieri de ma in secven ial . Cuvntul cheie STATE i instruc iunile urm toare descriu o stare din diagrama de st ri, ele incluznd o valoare a st rii sau un nume simbolic pentru stare, o instruc iune care descrie tranzi ia st rii i, op ional, o ecua ie care descrie o ie irile asociate st rii. n descrierea de mai sus registru_stare este un identificator pentru semnalele care definesc starea ma inii secven iale. Se poate utiliza o nota ie simbolic a registrului de stare, definit anterior n sec iunea declara ii. valoare_stare: poate fi o expresie , o valoare sau un nume simbolic pentru starea curent . ecuatie : op ional, o ecua ie care descrie ie irile asociate st rii instructiune_tranzitie_stare: instruc iunile "If-Then-Else", CASE sau GOTO utilizate pentru a descrie starea urm toare; op ional sunt urmate de ecua iile de tranzi ie descrise cu o instruc iune WITH. Instruc iunea If-Then-Else: Este utilizat pentru a descrie urm toarea stare i pentru a specifica condi iile de tranzi ie mutual exclusive. Sintaxa este urm toarea: IF expresie THEN expresie _stare [ELSE expresie _stare] ; Mai sus, expresie_stare poate fi o expresie logic sau un nume simbolic al st rii. Clauza ELSE este op ional . Instruc iunile IF-Then-Else pot fi combinate cu instruc iuni Goto, Case i With.

10

OBS. "IF-Then-Else" poate fi utilizat doar n sec iunea state_diagram; pentru descrierea unor func ii logice combina ionale (sec iunea ecua ii) se utilizeaz "When-If-Then". n urm torul exemplu (o ma in cu 2 st ri i dou ie iri) se define te mai nti registrul de stare, n sec iunea declara ii: SREG = [Q1, Q0]; "definim registrul de stare S0 = [0, 1]; S1 = [1, 1]; state_diagram SREG state S0: OUT1 = 1; if A then S1 else S0; state S1: OUT2 =1; if A then S0 else S1; Instruc iunile "If-Then-Else" pot fi de asemenea imbricate. Instruc iunea "with": Sintaxa instruc iunii este: instructiune_tranzitie_stare expresie_stare WITH ecuatie [ecuatie ] ... ; Unde instructiune_tranzitie_stare poate fi o instruc iune "If-then-else", 'Goto" sau "Case"; expresie_stare descrie starea urm toare, iar ecua ie este ecua ia care descrie ie irile asociate st rii. n locul unei simple expresii de stare se pot utiliza tot instruc iunile "If-Then-Else", "Goto" sau "Case".Instruc iunea "With" permite ca ecua iile de ie ire s fie scrise n termeni de tranzi ii. Exemplul 1: if ( X#Y==1 ) then S1 with Z=1 else S2; n exemplul de mai sus ie irea Z va fi 1 n momentul n care expresia este evaluat ca fiind adev rat (tranzi ia f cndu-se n starea S1). Expresia care apare mpreun cu WITH poate fi orice expresie care va fi ns evaluat doar cnd condi ia anterioar este adev rat , ca n exemplul urm tor: if X&!Y then S3 with Z=X#Y else S2 with Z=Y; Instruc iunea este util i n descrierea ie irilor de tip registru deoarece aceste ie iri vor fi actualizate la urm torul ciclu al semnalului de ceas. Este astfel posibil s descriem c o anumit ie ire de tip registru va avea o valoare specific dup o anumit tranzi ie, ca n urm torul exemplu: state S1: if RST then S2 with { OUT1 : = 1; Error_Adrs : = ADDRESS; } else if (ADDRESS <= ^hC101) then S4 else S1; S-au utilizat acoladele pentru a delimita blocul de asign ri asociat instruc iunii With.

11

Dimensiunea timp trebuie avut n vedere atunci cnd instruc iunea WITH se folose te mpreun cu ie iri combina ionale sau asincrone (ca n cazul unei ma ini Mealy). La o ma in Mealy ie irile se modific n momentul n care se modific intr rile, astfel c ie irile vor fi stabile doar la sfr itul unui timp de stare (nainte de tranzi ia activ a semnalului de ceas). Din acest punct de vedere o ma in Moore (cu ie iri sincrone cu starea) este mai avantajoas .

Instruc iunea Case : Sintaxa este urm toarea: CASE expresie : expresie _stare; [ expresie : expresie _stare; ] : ENDCASE ; Unde expresie este orice expresie ABEL valid i expresie_stare descrie starea urm toare (urmat op ional de instruc iunea WITH). Exemplu: State S0: case ( A == 0) : S1; ( A == 1) : S0; endcase; Instruc iunea case este utilizat pentru a specifica o secven de condi ii de tranzi ie mutual exclusive, corespunznd urm toarei st ri. Condi iile specificate trebuie s fie mutual exclusive (dou tranzi ii nu pot fi adev rate n acela i timp), n caz contrar rezultatele (tranzitia la starea urm toare) sunt imprevizibile. d. Extensii de tip .DOT Aceast categorie de facilit i se pot utiliza pentru a descrie mai precis comportarea circuitului. Reprezint o modalitate de a descrie semnalele interne i nodurile asociate cu un semnal primar. Sintaxa folosit este nume_semnal.extensie. Numele extensiei este independent de tipul de liter folosit (mare sau mic). Unele din aceste extensii sunt de uz general (numite i independente de arhitectur sau pinto-pin) putnd fi folosite pentru o mare varietate de circuite programabile (PAL, GAL, CPLD, etc). Altele pot fi folosite doar pentru clase specifice de circuite, fiind numite i dependente de arhitectur sau cu extensii detailate. n general se pot utiliza ambele categorii de extensii. O parte din aceste extensii sunt descrise n tabelul urm tor. Extensie Descriere Independente de arhitectur sau extensii pin-to-pin (pin la pin) .ACLR Reset asincron .ASET Preset asincron .CLK Intrare de ceas ntr-un bistabil cu comutare pe front. .CLR Reset sincron .COM Reac ie combina ional provenind de la intrarea de date .FG Reac ie registru (bistabil) .OE Activare ie ire (de tip buffer tri-state) .PIN Reac ie pin .SET Preset sincron

12

Extensii specifice circuitului (dependente de arhitectur ) .D Intrare date ntr-un bistabil de tip D .J Intrare J ntr-un bistabil de tip .K Intrare K ntr-un bistabil de tip JK .S Intrare S ntr-un bistabil de tip SR .R Intrare R ntr-un bistabil de tip SR .T Intrare T ntr-un bistabil de tip T .Q Reac ie registru (bistabil) .AP Preset asincron .AR Reset asincron .SP Preset sincron .SR Reset sincron Figura urm toare ilustreaz cteva din aceste extensii.

Exemplul 1: [S7..S0].oe = ACTIV; unde semnalul ACTIV controleaz bufferele tri-state ale celor 8 ie iri S7..S0. Cnd ACTIV este n 1 ie irile sunt active, n caz contrar(ACTIV=0) ie irile respective sunt n starea de nalt impedan (High-Z). Exemplul 2: Q.AR = reset; Y.AR = reset; [Z.ar, Y.ar] = reset; aici ie irea bistabilelor Z si Y va fi adus n 0 dac intrarea reset este n 1. Pentru n elegerea semnifica iei acestui tip de extensii vom exemplifica cu ajutorul unei ecua ii care folose te operatorul de asignare tip registru(:=) i unde Preset este o intrare : Q1 := !Q1 # Preset; Aici Q1 i va men ine starea (valoarea curent ) pn n momentul n care elementul de memorie (circuitul bistabil) asociat cu acest semnal prime te un semnal de ceas. Acesta ecua ie reprezint o descriere pin-to-pin a semnalului de ie ire Q1. Ea descrie comportarea semnalului n termeni de valori dorite pentru pinul de ie ire func ie de intrare i este complet independent de arhitectura dispozitivului utilizat pentru implementare.

(a) independent de arhitectur

(b) dependent de arhitectura bistabilului (D sau T)

13

Totu i, n ecua ia de mai sus exist o condi ie ambigu de reac ie pentru elementul de memorie. Semnalul Q1 apare n partea dreapt a ecua iei, dar nu avem nici o informa ie de unde anume provine aceast reac ie: direct din logica combina ional care formeaz intrarea bistabilului sau din pinul de ie ire asociat cu semnalul Q1. Nu exist de asemenea nici o informa ie despre ce tip de bistabil se va utiliza (de i algoritmii de sintez pot , teoretic, plasa acesta ecua ie n orice tip de bistabil posibil). Ecua ia poate fi mai concret astfel: Q1.CLK = Clock; "Semnal de ceas provenind de la o intrare Q1 := !Q1.FB # Preset; " Reactie provenind din iesirea bistabilului Acum setul de ecua ii descrie complet circuitul, informa ia fiind suficient pentru ca acest circuit s func ioneze indiferent de dispozitivul n care va fi implementat. Reac ia provine direct din ie irea negat a bistabilului , iar extensia .CLK arat ca bistabilul este cu comutare pe front ( i nu unul de tip latch !). Spre deosebire de descrierea pin-to-pin acela i circuit poate fi descris i ntr-o form detailat astfel: Q1.CLK = Clock; "Semnal de ceas de la intrare Q1.D = !Q1.Q # Preset; "Se utilizeaza CBB de tip D n aceast form n care este descris intrarea D a bistabilului i specificat reac ia apar unele restric ii legate de arhitectura dispozitivului n care va fi implementat proiectul. Mai mult, ecua iile descriu doar intrarea i reac ia ne existnd nici o informa ie despre configura ia pinului de ie ire. n consecin aceast descriere va func iona diferit cnd va fi implementat ntr-un dispozitiv cu ie iri inversate (negate) sau ntr-unul cu ie iri ne inversate. Pentru a men ine o comportare corect a pinului , folosind descrierea detailat , este necesar un element suplimentar al limbajului: atributul `buffer` (sau complementul s u, atributul `invert`). Atributul `buffer` ne asigur ca n implementarea final nu va exista inversare ntre ie irea bistabilului i pinul de ie ire asociat cu Q1. Astfel n sec iunea de declara ii trebuie s apar : Q1 pin istype 'buffer'; Observa ie Pentru un circuit CPLD, si nu numai, o modalitate de a n elege diferen a ntre descrierea pin-to-pin si descrierea detailat este de a vedea descrierea detailat ca o specifica ie a macrocelulei. n figur este prezentat o macrocelul generic asociat semnalului q1. Se observ c exist un nivel de inversare programabil ntre iesirea bistabilului si pin, astfel c pinul q1 poate avea o comportare diferit de cea a iesirii Q(q1.q). Ori de cte ori folosim o descriere pinto-pin in ABEL, va fi sintetizat o macrocelul generic similar celei din figur , indiferent de tipul particular de macrocelul existent n dispozitivul PLD.

14

8. Vectori de test Vectorii de test sunt op ionali i reprezint o modalitate de a verifica func ionarea corect a sistemului numeric proiectat. Ei sunt folositi pentru simularea modelului intern al dispozitivului i testarea func ional a dispozitivului programat. Prin intermediul lor specific m comportarea a teptat a sistemului prin descrierea explicit a ie irilor func ie de intr ri. Sintaxa este urm toarea : Test_vectors (intrare [, intrare ].. -> ie ire [,ie ire] .. ) [valori intr ri -> valori ie iri ; ] : Ca exemplu vom relua semisumatorul prezentat anterior pentru care vom avea: Test_vectors ( [A, B] -> [Sum, Carry] ) [ 0, 0 ] -> [0, 0]; [ 0, 1 ] -> [1, 0]; [ 1, 0 ] -> [1, 0]; [ 1, 1 ] -> [1, 1]; sau utiliznd constantele numerice definite anterior: Test_vectors ( [A, B] -> [Sum, Carry] ) 0 -> 0; 1 -> 2; 2 -> 2; 3 -> 3; Este permis folosirea constantelor .X. , .C., .Z. ca i a oric ror alte constante simbolice definite anterior: test_vectors ( [CLK, RESET, A, B ] -> [ Y0, Y1, Y3] ) [.X., 1, .X.,.X.] -> [ S0, 0, 0]; [.C., 0, 0, 1 ] -> [ S0, 0, 0]; [.C., 1, 1, 0 ] -> [ S0, 0, 1]; 9. Instruc iuni care descriu propriet i ABEL permite transmiterea (n momentul implement rii) unor propriet i specifice dispozitivului PLD prin intermediul instruc iunii property. Aceste propriet i sunt de fapt transmise programului care face implementarea (fitter). Pentru dispozitivele CPLD aceste propriet i includ: viteza de varia ie a ie irilor (timpii de front -slew rate), , puterea consumat , valorile care vor fi prenc rcate n bistabili la power-up, utilizarea resurselor logice (plasare), optimizare sau protejarea la citire . Acelea i propriet i pot fi stabilite i ca op iuni ale diverselor componente ale mediului integrat de dezvoltare (compilator, fitter, programator), lucru care este de dorit deoarece ofer o mai mare independen de dispozitiv a proiectului . 10. Diverse a. Declara ii de tip active-low (n 0) Un semnal de tip activ n 0 este definit prin prefixarea cu operatorul ! : !OUT pin istype 'com' ; Cnd acest semnal va fi utilizat n descrierea logic , el va fi n mod automat complementat.

15

S consider m urm torul exemplu: module EXEMPLU A, B pin ; !OUT pin istype 'com'; equations OUT = A & !B # !A & B ; end n acest exemplu semnalul de ie ire OUT este XOR-ul ntre A si B , fiind n 1 (High) cnd doar una din intr ri este n 1, altcumva fiind n 0. Deoarece semnalul de ie ire a fost ns declarat activ n 0 (!OUT), pinul de ie ire OUT va fi n 0 doar cnd numai una din intr ri este n 1. Acela i rezultat se putea ob ine inversnd pe OUT la nivelul ecua iei i declarndu-l doar ca OUT (o descriere explicit pin la pin a semnalului activ n 0), a a cum se vede n exemplul urm tor: module EXEMPLU A, B pin ; OUT pin istype 'com'; equations !OUT = A & !B # !A & B ; end Declara iile de tip activ n 0 pot fi utilizate i pentru mul imi, ca n urm torul exemplu: A = [A2,A1,A0]; " declaratie multime B = [B2,B1.B0]; " declaratie multime X = [X2,X1.X0]; " declaratie multime !X = A & !B # !A & B; Ultima ecua ie este echivalent cu a scrie : !X0 = A0 & !B0 # !A0 & B0; !X1 = A1 & !B1 # !A1 & B1; !X2 = A2 & !B2 # !A2 & B2; b. Directive Utilizarea directivelor duce la anumite modific ri ale fi ierului surs ABEL, n momentul prelucrarii acestora. Se pot include condi ional sec iuni de surs ABEL, se pot include por iuni din alte surse ABEL, se pot afi a diverse mesaje pe parcursul compil rii, etc. Prin utilizarea i de parametrii, unele din directive permit construirea i manipularea unor structuri complexe. Sintaxa utilizat este: @directiva [parametrii] . Un exemplu prezentat anterior este directiva @ALTERNATE. Alte directive mai utilizate ar fi: @CONST, @DCSET, @EXIT, @IF, @INCLUDE, @MESSAGE, @REPEAT, @RADIX, etc. Exemplu: @repeat 100 { [.C.]->[0,0] " insereaza de 100 de ori vectorul de test cuprins ntre acolade " in textul sursa, intr-o sectiune test_vectors }

16

11. Exemple Familia de circuite destinat implement rii acestor circuite este cea de circuite CPLD Xilinx(9500,9500XL,9500XV, Cool Runner) desi ele pot fi implementate si folosind circuite simple PLD (PAL sau GAL). Compilatorul ABEL se presupune c este cel din mediul de programare Xilinx Webpack. n toate exemplele care urmeaz cuvintele cheie au fost reprezentate cu litere ngrosate(bold).

11.1. Diverse circuite MSI din familiile logice standardizate 11.1.1 Buffer tri-state, octal, bi-directional 74LS245(74HC245,etc)

module SN74LS245 title 'Octal Bidirectional Bus Transceiver' OE_, DIR pin; A1..A8 pin istype 'com'; B1..B8 pin istype 'com'; A = [A8..A1]; B = [B8..B1]; X =.X.; Z = .Z.; equations A = B; B = A; A.oe = !DIR & !OE_; B.oe = DIR & !OE_; test_vectors ([OE_,DIR,A,B] -> [A,B]) [1, 0, 0, 0] -> [Z,Z]; [0,0,X,^h00] -> [^h00,X]; [0,0,X,^h55] -> [^h55,X]; [0,0,X,^hAA] -> [^hAA,X]; [0,0,X,^hFF] -> [^hFF,X]; [0,0,X,^hF0] -> [^hF0,X]; [0,1,X,X] -> [Z,X]; [0,1,^h00,X] -> [X,^h00]; [0,1,^h55,X] -> [X,^h55]; [0,1,^hAA,X] -> [X,^hAA]; end 17

11.1.2 Registru de deplasare, cu ncarcare paralel , asincron , 74LS165 (74HCT165,etc)


Module SN74LS165 Title 'Parallel-Load 8-bit Shift Register, async load' ShLd, ClkInh, Clk, SER pin; A,B,C,D,E,F,G,H pin; QA,QB,QC,QD,QE,QF,QG node istype 'reg, buffer'; QH pin istype 'reg, buffer'; QH_ pin istype 'com'; Equations QH_ = !QH; [QH,QG,QF,QE,QD,QC,QB,QA] : = [QG,QF,QE,QD,QC,QB,QA,SER]; [QH,QG,QF,QE,QD,QC,QB,QA].clk = Clk # ClkInh; when (!ShLd) then { [QH,QG,QF,QE,QD,QC,QB,QA].ar = ![H,G,F,E,D,C,B,A]; [QH,QG,QF,QE,QD,QC,QB,QA].ap = [H,G,F,E,D,C,B,A]; } Test_Vectors ([Clk,ClkInh,ShLd,SER,A,B,C,D,E,F,G,H]->[QA,QB,QC,QD,QE,QF,QG,QH,QH_]) [.C., 1 , 0 , 0 ,1,0,1,0,1,0,1,1]->[ 1, 0, 1, 0, 1, 0, 1, 1, 0 ]; [.C., 1 , 1 , 0 ,1,0,1,0,1,0,1,1]->[ 1, 0, 1, 0, 1, 0, 1, 1, 0 ]; [.C., 0 , 1 , 0 ,0,0,0,0,0,0,0,0]->[ 0, 1, 0, 1, 0, 1, 0, 1, 0 ]; [.C., 0 , 1 , 0 ,0,0,0,0,0,0,0,0]->[ 0, 0, 1, 0, 1, 0, 1, 0, 1 ]; [.C., 0 , 1 , 1 ,0,0,0,0,0,0,0,0]->[ 1, 0, 0, 1, 0, 1, 0, 1, 0 ]; [.C., 0 , 1 , 1 ,0,1,1,1,1,0,0,0]->[ 1, 1, 0, 0, 1, 0, 1, 0, 1 ]; [.C., 0 , 1 , 0 ,0,1,1,1,1,1,0,0]->[ 0, 1, 1, 0, 0, 1, 0, 1, 0 ]; [ 0 , 0 , 1 , 0 ,0,1,1,1,1,1,0,0]->[ 0, 1, 1, 0, 0, 1, 0, 1, 0 ]; [ 0 , 1 , 1 , 0 ,0,1,1,1,1,1,0,0]->[ 0, 0, 1, 1, 0, 0, 1, 0, 1 ]; [.C., 1 , 0 , 0 ,0,1,1,1,1,1,0,0]->[ 0, 1, 1, 1, 1, 1, 0, 0, 1 ]; End 18

11.1.3 Registru octal, de tip D-latch(transparent), cu iesire tri-state 74LS373 (74HCT373,etc.) Registru octal, de tip D cu comutare pe front, cu iesire tri-state 74LS374 (74HCT374, etc.)

Module SN74LS373 Title 'Octal D-type Transparent Latch' OC,C pin; D8..D1 pin; Q8..Q1 pin istype 'reg,buffer'; Input = [D8..D1]; Output = [Q8..Q1]; Equations Output := Input; Output.lh = C; asa se genereaza un latch transparent in high!! Output.oe = !OC; Test_Vectors ([OC ,C ,Input] -> Output) [ 1 ,.X., .X. ] -> .Z.; [ 0 , 1 ,^h00 ] -> ^h00; [ 0 , 1 ,^h55 ] -> ^h55; [ 0 , 1 ,^hAA ] -> ^hAA; [ 0 , 1 ,^hFF ] -> ^hFF; [ 0 , 1 ,^hA5 ] -> ^hA5; [ 0 , 0 ,^hA5 ] -> ^hA5; [ 0 , 0 ,^h00 ] -> ^hA5; [ 0 , 1 ,^h22 ] -> ^h22; End

19

Module SN74LS374 Title 'Octal edge triggered D-type flip-flops' OC, CLK D8..D1 Q8..Q1 pin; pin; pin istype 'reg,buffer';

Input = [D8..D1]; Output = [Q8..Q1]; .C.= c; Equations Output := Input; Output.clk = CLK; Output.oe = !OC; Test_Vectors ([OC ,CLK ,Input] -> Output) [ 1 ,.X., .X. ] -> .Z.; [ 0 , c ,^h00 ] -> ^h00; [ 0 , c ,^h55 ] -> ^h55; [ 0 , c ,^hAA ] -> ^hAA; [ 0 , c ,^hFF ] -> ^hFF; [ 0 , c ,^hA5 ] -> ^hA5; [ 0 , 0 ,^hA5 ] -> ^hA5; [ 0 , 0 ,^h00 ] -> ^hA5; [ 0 , c ,^h22 ] -> ^h22; End 11.2 Decodificator de adrese Exemplul prezint una din aplica iile tipice ale logicii programabile i anume realizarea unui decodificator pentru spa iul de memorie al unui microprocesor de 8 biti. Pentru identificarea spa iului specific de adres se utilizeaz cei mai semnificativi bi i A15..A10, dintr-o magistral de adrese de 16 bi i(A15..A0).

Exist 4 sec iuni de natur diferit n spa iul de memorie de 64k, fiecare identificat printr-un semnal de ie ire al decodificatorului, i anume: DRAM: 0000- DFFF H (RAM dinamic) I/O : E000 E7FF H (porturi intrare /ie ire mapate n memorie) 20

ROM2: F000-F7FF H (EPROM 2) ROM1 : F800-FFFF H (EPROM 1) Semnalele de ie ire sunt active n 0 (se utilizeaz semnal definite explicit ca fiind active n 0). Utilizarea mul imii Adresa i a nota iei pentru un domeniu (..) simplific substan ial programul. module dec_mem title ` decodificator memorie uP ` A15..A0 pin; ROM1,IO,ROM2,DRAM pin istype `com`; H,L,X = 1, 0, .X. ; Adresa =[ A15..A0]; equations !DRAM = (Adresa <= ^hDFFF); !IO = (Adresa >= ^hE000) & (Adresa <= ^hE7FF); !ROM2 = (Adresa >= ^hF000) & (Adresa <= ^hF7FF); !ROM1 = (Adresa >= ^hF800); test_vectors (Adresa -> [ROM1,ROM2,IO,DRAM]) ^h0000 -> [ H,H, H, L ]; ^h4000 -> [ H, H, H, L ]; ^h8000 -> [ H, H, H, L ]; ^hC000 -> [ H, H, H, L ]; ^hE000 -> [ H, H, L, H ]; ^hE800 -> [ H, H, H, H ]; ^hF000 -> [ H, L, H, H ]; ^hF800 -> [ L, H, H, H ]; end 11.2 Multiplexor 12 : 4 Exemplul prezint de fapt un multiplexor 3 la 1, pentru 3 grupe de semnale, fiecare grup avnd 4 bi i: a3..a0, b3..b0 i c3..c0. Se utilizeaz dou semnale de selec ie (s1,s0) , combina ia s1s0=11 (3) avnd acela i efect ca s1s0=10 (2). Ie irea este reprezentat de y3..y0. Folosirea instruc iunii when .. then permite cea mai compact descriere a unui multiplexor. Pentru toate grupele de semnale relevante s-au utilizat mul imi: select, a, b, c i y.

21

module Mux12to4 title `multiplexor 12 la 4 ` a0..a3 pin; b0..b3 pin; c0..c3 pin; s1,s0 pin; ``selectii y0..y3 pin; ``iesiri H = [1,1,1,1]; L = [0,0,0,0]; X = .X. ; select = [s1,s0]; y = [y3..y0]; a = [a3..a0]; b = [b3..b0]; c = [c3..c0]; equations when (select == 0) then y = a; when (select == 1) then y = b; when (select == 2) then y = c; when (select == 3) then y = c; test_vectors ([select, a, b, c] [ 0 , 1, X, X] [ 0 ,10, H, L] [ 0 , 5, H, L] [ 1 , H, 3, H] [ 1 ,10, 7, H] [ 1 , L,15, L] [ 2 , L, L, 8] [ 2 , H, H, 9] [ 2 , L, L, 1] [ 3 , H, H, 0] [ 3 , L, L, 9] [ 3 , H, L, 0] end

-> -> -> -> -> -> -> -> -> -> -> -> ->

y) 1; 10; 5; 3; 7; 15; 8; 9; 1; 0; 9; 0; ``select = 0 a->y

``select = 1

b->y

``select = 2

c->y

``select = 3

c->y

11.3 Comparator de 4 bi i n acest exemplu este prezentat un comparator de 4 bi i cu dou intr ri generice de 4 bi i A (A3..A0) i B (B3..B0), oferind 4 ie iri active n 1 (NE- diferit , EQ- egal, GT- mai mare i LT- mai mic) . Tem S se completeze corespunz tor vectorii de test care s permit verificarea din punct de vedere func ional a tuturor celor 4 ie iri. Pentru vectorii de test se pot defini i utiliza constante corespunz toare, care s u ureze scrierea.

22

module comp4 title ` comparator 4 biti ` A3..A0 pin; A = [A3..A0]; B3..B0 pin; B = [B3..B0]; NE,EQ,GT,LT pin istype `com`; ``NE diferit ``EQ- egal ``GT- mai mare ``LT mai mic equations EQ = (A = = B); NE = !(A = = B); GT = (A > B); LT = !((A > B) # (A = = B)); Test_vectors `` aici vectorii de test !!! end

11.4 Decodificator pentru un afi or LED cu 7 segmente Astfel de decodificatoare exist i n diverse familii de circuite numerice (ex. 7446, 7447, 4053, etc.) dar o implementare PLD ofer ntotdeauna o flexibilitate suplimentar . El stabile te o coresponden ntre m rimea de intrare de 4 bi i interpretat ca un cod BCD de 4 bi i (cifre ntre 0 i 9) si un sistem de afi are alfanumeric organizat sub forma a 7 segmente. Prin aprinderea diferit a segmentelor este posibil afi area cel pu in a cifrelor de la 0 la 9. Cele 7 segmente sunt notate de la a la g pozi ia lor fiind standard pentru toate afi oarele (vezi asignare n comentariu si figura). Decodificatorul este realizat pentru un afi or cu anod comun, aprinderea segmentului (ON) presupunnd c ie irea respectiv este adus n 0 logic. Pentru afi oarele cu catod comun ie irea este activ n 1 si este suficient s modific m doar definirea constantelor ON si OFF. Mai exist i o intrare de activare Ena, activ n 0 logic. Cnd intrarea este inactiv (Ena =1 ), ie irile sunt aduse n starea de nalt impedan (High -Z) toate segmentele fiind stinse, indiferent de starea intr rilor.

23

module bcd7 title `dec afisor 7segmente ` `` identificare segmente `` -a`` f| |b `` -g`` e| |c `` -dD3,D2,D1,D0,Ena pin; a,b,c,d,e,f,g pin istype `com`; bcd = [D3,D2,D1,D0]; led = [a,b,c,d,e,f,g]; ON,OFF = 0,1; ``LED-uri cu anod comun L,H,X,Z = 0,1,.X.,.Z.; equations led.oe = !Ena; truth_table (bcd -> [ a, b, c, d, e, f, g ]) 0 -> [ ON, ON, ON, ON, ON, ON, OFF]; 1 -> [ OFF,ON, ON, OFF,OFF,OFF,OFF]; 2 -> [ ON, ON, OFF,ON, ON, OFF,ON ]; 3 -> [ ON, ON, ON, ON, OFF,OFF,ON ]; 4 -> [ OFF,ON, ON, OFF,OFF,ON, ON ]; 5 -> [ ON, OFF,ON, ON, OFF,ON, ON ]; 6 -> [ ON, OFF,ON, ON, ON, ON, ON ]; 7 -> [ ON, ON, ON, OFF,OFF,OFF,OFF]; 8 -> [ ON, ON, ON, ON, ON, ON, ON ]; 9 -> [ ON, ON, ON, ON, OFF,ON, ON ]; end

11.5 Num r tor universal de 4 bi i Urm torul exemplu ilustreaz implementarea unui num r tor binar sincron de 4 bi i. Num r torul este bidirec ional, sensul de num rare fiind controlat prin intermediul intr rii u_d . De asemenea num r torul poate fi nc rcat paralel, intrarea de nc rcare fiind ld (activ n 1) i intr rile corespunz toare de date fiind d3..d0. Este posibil i oprirea/pornirea num r rii cu ajutorul intr rii cnten (1 num r , 0 - oprit). Ie irile sunt q3 ..q0. Exist i o intrare asincron de aducere n 0(reset) numit rst.

24

Descrierea func ion rii se face cu ajutorul ecua iilor i nu al diagramelor de stare, fiind mult mai compact n acest caz. Exist 4 moduri de operare ale num r torului: - nc rcare paralel (sincron ) a datelor de pe intr rile de date (LOAD) - num rare oprit (HOLD) - num r n sus (DOWN) - num r n jos (UP) Modul nc rcare este prioritar, activarea intr rii ld (n 1) f cnd ca ie irile q s ia valoarea intr rilor d , la urm torul semnal de ceas (nc rcare sincron ). Modul num rare oprit este al doilea ca prioritate; pentru a num ra este necesar ca intrarea cnten=1. n momentul n care cnten = 0 (dac i ld=0) num rarea se opre te, ie irile q p strndu- i valoarea avut n acel moment. Num r torul este resetat (q3..q0 = 0) n momentul n care intrarea rst =1 (asincron, independent de evolutia intrarii de ceas) . Asign rile pentru mul imea count sunt asign ri de tip registru (: =), to i bistabilii au acela i semnal de ceas i respectiv acela i semnal de reset asincron (se utilizeaz extensiile .DOT de tip .clk i .ar).

module unicnt4 title ` numarator binar de 4 biti bidirectional cu incarcare paralela `; "constante X = .X.; "Intrari d3..d0 pin; "intrari date 4-biti clk pin; "intrare ceas rst pin; "reset asincron cnten pin; "activare numarare ld pin; "incarca date paralel u_d pin; "Up/Down sens numarare 1 =up(in sus), 0- down (in jos) "Iesiri q3..q0 pin istype `reg`; "bistabili si iesiri numarator "definire multimi data = [d3..d0]; "date intrare count = [q3..q0]; "numarator "definirea modurilor de lucru MODE = [cnten, ld, u_d] ; "Modul de lucru este definit LOAD = (MODE = = [ X , 1, X ]); "ca o multime de valori ale HOLD = (MODE = = [ 0 , 0, X ]); " intrarilor de control. UP = (MODE = = [ 1 , 0, 1 ]); " Numele simbolic este definit ca multimea MODE DOWN = ( MODE = = [ 1 , 0, 0 ] ); " careia i se asigneaza o valoare 25

equations when LOAD then count := data else when UP then count := count + 1 else when DOWN then count := count - 1 else when HOLD then count := count; count.clk = clk; count.ar = rst; test_vectors "aici vectori de test end

"incarca date paralel "numara in sus " numara in jos "opreste numararea "semnalul de ceas pentru toti bistabilii "si intrarea de reset asincrona

11.6 Ma in secvential sincron Ma ina sincron are trei st ri: A,B si C. Mai are trei intr ri: start, hold si reset si trei iesiri: halt(sincron -ca o masin Moore), in_B si in_C (asincrone-ca o masin Mealy). Mai exist , evident, si o intrare de ceas(tact) clock precum i o intrare de activare enab, pentru ie iri care sunt de tip tri-state. Urm toarea diagram de stare descrie tranzi iile de stare i iesirile ma inii. Ma ina porne te din starea A si r mane acolo pn cnd intrarea start devine 1. Trece apoi n starea B, n starea C i napoi n starea A. R mane n starea A pan cand start devine din nou activ n 1. Daca intrarea reset este activ , n 1, ma ina se intoarce n starea A la urm torul semnal de ceas(tact). Dac acest reset apare n starea B, o ie ire sincron halt se activeaz (n 1) i r mane activ pn cnd start devine activ din nou. Pe durata st rilor B si C, ie irile asincrone in_B si in_C trec n 1 pentru a indica starea curent . Activarea intr rii hold (in 1) face ca ma ina s r mn n starea B sau C pn cnd hold devine inactiv sau se activeaz reset.

Valoarea vectorilor de stare este aleas astfel ca la pornire( power -up), cnd toate registrele(bistabilele) sunt ini ializate implicit n 0, s se plece dintr-o stare cunoscut , starea A (registrul de stare este 00)!!.

26

module Masina de paine title 'Exemplu de masina secventiala'; q1,q0 pin istype 'reg,buffer'; clock,enab,start,hold,reset pin; halt pin istype 'reg, buffer '; in_B,in_C pin; ''definim registrul de stare, avem nevoie de 2 registre(bistabile) sreg = [q1,q0]; ''Definim si valorile starilor ... A = 0; B = 1; C = 2; equations [q1, q0, halt].clk = clock; [q1, q0, halt].oe = !enab;

state_diagram sreg; State A: ''Sta in starea A pana cand start devine activ. in_B = 0; in_C = 0; IF (start & !reset) THEN B WITH halt : = 0; ELSE A WITH halt : = halt; State B: ''trece in starea C daca reset nu este activ in_B = 1; ''sau hold este activ; halt devine activ daca avem reset in_C = 0; IF (reset) THEN A WITH halt : = 1; ELSE IF (hold) THEN B WITH halt : = 0; ELSE C WITH halt : = 0; '' State C: ''Se intoarce in A daca halt nu este activ. in_B = 0; ''Reset-ul este prioritar fata de hold. in_C = 1; IF (hold & !reset) THEN C WITH halt : = 0; ELSE A WITH halt : = 0; ''aici vectorii de test... end 11.7 Proiectarea ierarhic Proiectarea ierarhic reprezint o modalitate de a dezvolta aplica ii mai complexe ca un tot unitar. Mai reprezint si un mod util de organiza si structura un proiect ABEL-HDL. Vor exista mai multe module, din care unul pe nivelul superior(numit si nivel top) si cel pu in unul pe un nivel inferior. La rndul lor modulele de pe nivelele inferioare pot instan ia (apela) alte module aflate pe nivele inferioare fa de ele. In modulul de pe nivelul superior interfa a (intr ri->iesiri) este definit cu ajutorul cuvntului cheie INTERFACE, iar identificarea instan ei modulului este f cut cu FUNCTIONAL_BLOCK (pot exista mai multe instan ieri ale aceluiasi modul). Vom prezenta un exemplu elementar, pur didactic, in care vom implementa, la nivelul top, o poart NAND cu ajutorul unui modul AND definit pe un nivel inferior.

27

Sursa pentru modulul top este urm toarea: MODULE NAND1 TITLE 'Poarta NAND ierarhica instantiaza o poarta AND.' I1, I2, O1 pin; and1 INTERFACE(IN1, IN2 -> OUT1); my_and functional_block and1; EQUATIONS my_and.IN1 = I1; my_and.IN2 = I2; O1 = ! my_and.OUT1; END Modulul de pe nivelul inferior este descris de sursa urm toare: MODULE and1 TITLE 'Poarta and1 care va fi instantiata de NAND1' IN1, IN2, OUT1 pin; EQUATIONS OUT1 = IN1 & IN2; END Numele pinilor (simbolul asignat) trebuie s fie acelasi (aten ie la tipul de litera!) cu cel care apare in declara ia interface din modulul top. Deasemenea numele modulului instan iat (la noi and1) declarat in modulul top trebuie s fie acelasi cu cel care apare in declara ia MODULE din modulul de pe nivel inferior. Este bine ca mai inti s fie create sursele pentru modulele inferioare si dup aceea sursele pentru modulele de pe nivelele superioare.

11.8 Alte descrieri utile n ABEL, orientate pe arhitectura CPLD Xilinx 11.8.1 Crearea semnalelor bi-directionale Exemplul este util pentru implementarea unor registre de stare, la care bi ii individuali din componen a acestora pot fi scri i sau citi i, prin intermediul datelor vehiculate pe o magistral tri-state. Avem doi bistabili (doua registre) out0 si out1. Semnalele de ceas strobe0 si strobe1 precum i cel de activare a bufferului de iesire read se presupune ca au fost definite anterior. Data de pe pinul de pe intrare poate fi scris in registrul out0 astfel: out0:= out0.pin; `` data de pe pin in registru out0.clk = strobe0; `` pe frontul crescator al lui strobe0 Data din out0 este citit napoi pe pin(pe magistral ) astfel: out0.oe = read; `` read este activ in 1

28

n out1 se va scrie un 1, pe frontul cresc tor al lui strobe1, numai cand starea lui out0 si cea pinului este diferit (un XOR): out1 : = out0.q $ out0.pin; out1.clk = strobe1; 11.8.2 Multiplexarea a dou sau mai multe semnale de iesire O modalitate simpl este de lega impreun pinii de iesire corespunz tori celor dou semnale multiplexate (dout1, dout2) si de a utiliza bufferele de iesire tri-state(comandate cu select si !select). La un moment dat nu trebuie s fie activ (n 1) dect un singur semnal de control al bufferului, deci numai o iesire poate fi activ , restul fiind in tri-state. Acesta este si motivul pentru care semnalele de comand pentru aceste buffere, in exemplul nostru, sunt complementare. dout0 : = data0; dout1 : = data1; dout0.oe = select; dout1.oe = !select;

Legate impreuna in afara circuitului

Se poate utiliza multiplexorul dintr-o alt macrocelul i data s fie adus la ie ire printr-un singur pin. Dezavantajul este c se foloseste o macrocelul pentru fiecare bit al multiplexorului. n exemplul de mai jos s0 = = select. dout = data0 & select
29

# data1 & !select;

Se mai poate utiliza i registrul(bistabilul) din macrocelula respectiv pentru a scurta timpul de propagare de la intrarea de ceas la ie ire (tCO). dout := data0 & select # data1 & !select;

Observatie La toate circuitele CPLD ale firmei Xilinx nu exist posibilitatea implement rii unei magistrale tri-state interne.

30