Diferență între revizuiri ale paginii „CID Seminar 2”
Linia 66: | Linia 66: | ||
# pentru două intrări a, b de 1 bit şi o ieşire care este activă când intrările sunt egale; | # pentru două intrări a, b de 1 bit şi o ieşire care este activă când intrările sunt egale; | ||
# pentru două intrări a, b de câte 3 biţi, cu o ieşire care este activă când intrările sunt egale; | # pentru două intrări a, b de câte 3 biţi, cu o ieşire care este activă când intrările sunt egale; | ||
− | # pentru două intrări a, b de câte 3 biţi, cu trei ieşiri care semnalează cele trei cazuri (a==b, a<b, a>b). | + | # pentru două intrări a, b de câte 3 biţi, cu trei ieşiri care semnalează cele trei cazuri (a==b, a<b, a\>b). |
==Exemplul 4== | ==Exemplul 4== |
Versiunea de la data 27 februarie 2014 15:58
În acest seminar veţi învăţa şi alte modalităţi de descriere a circuitelor combinaţionale cu ajutorul unor instrucţiuni uzuale (if, case).
Cuvinte cheie: atribuirea condiţionată, proces, listă de senzitivităţi
Sintaxa Verilog: assign, always, if, case
Verilog este un HDL, un limbaj de descriere hardware şi are numite caracteristici care derivă din faptul că limbajul este destinat descrierii, simulării şi sintezei unor circuite (şi nu execuţiei unor algoritmi). Astfel, anumite instrucţiuni precum assign şi always descriu (reprezintă) procese care se execută în paralel. Cu ajutorul lor se poate modela comportamentul unor circuite a căror ieşire se modifică de câte ori apare o modificare a semnalelor de la intrare.
Exemplul 1
Descrieţi în Verilog un circuit de selecţie cu două intrări (şi un bit de selecţie), folosind instrucţiunea de atribuire condiţionată.
Explicaţie suplimentară
Atribuirea continuă din Verilog, instrucţiunea assign, se evaluează continuu. De exemplu, expresia
assign a = b + c;
este calculată din nou la fiecare pas de simulare. Atribuirea continuă are rolul de a descrie funcţionarea circuitelor combinaţionale, în care ieşirea urmează modificările intrărilor. Toate instrucţiunile assign se execută în paralel, aşa cum toate componentele unui circuit funcţionează în acelaşi timp.
Instrucţiunea de atribuire condiţionată are forma
assign w = x ? a : b;
Atribuirea depinde de valoarea lui x:
- dacă x = 1, atunci w = a,
- iar pentru x = 0, atunci w = b.
Exemplul 2
Scrieţi funcţia de selecţie realizată de circuitul din exemplul anterior folosind instrucţiunea if.
Explicaţie suplimentară
Instrucţiunea if în Verilog are forma
if (conditie) ...... // de exemplu, if (a == b)
else ....;
Atribuirile dintr-o construcţie de acest tip sunt secvenţiale (nu se foloseşte assign) şi implică să declarăm variabilele respective, care îşi modifică valoarea, de tipul reg.
Instrucţiunea else poate lipsi. Mai multe instrucţiuni pot fi grupate în blocuri folosind begin ....end.
Reţineţi că în Verilog, instrucţiunea if se foloseşte numai în blocuri always sau initial.
În Verilog, instrucţiunea always descrie un proces care se execută atunci când se modifică cel puţin un semnal din lista de senzitivităţi (lista semnalelor care apare în paranteză, după simbolul @).
always @ (a or b or c) // aici nu se pune ";"
y = a + b + c; // datorita blocului always, atribuirea secvențială se
//recalculeaza de fiecare dată când se modifică
//unul dintre semnalele a, b sau c
// atentie! y este de tipul reg
Mai simplu, putem scrie
always @ (*)
Unde notaţia (*) desemneaza orice modificare a oricărui semnal din modulul curent.
Atunci când se simulează funcţionarea unui circuit, toate blocurile always se execută în paralel.
Exemplul 3
Descrieţi funcţia unui comparator folosind instrucţiunea assign, respectiv instrucţiunea if:
- pentru două intrări a, b de 1 bit şi o ieşire care este activă când intrările sunt egale;
- pentru două intrări a, b de câte 3 biţi, cu o ieşire care este activă când intrările sunt egale;
- pentru două intrări a, b de câte 3 biţi, cu trei ieşiri care semnalează cele trei cazuri (a==b, a<b, a\>b).
Exemplul 4
Descrieţi un multiplexor cu 4 intrări şi 2 biţi de selecţie folosind instrucţiunea case. Simulaţi funcţionarea circuitului.
Explicaţie suplimentară
Instrucţiunea case în Verilog are următorul format:
case (expresie_case)
valoare1: instrucţiune1; /* pentru diferite valori ale expresiei se executa
diferite instr*/
...
default: instrucţiune; /* cazul implicit, pentru valorile care nu au fost
precizate*/
endcase
ca şi instrucţiunea if, case se foloseşte numai într-un bloc always; variabilele care sunt atribuite trebuie să fie declarate de tip reg.
Exemplul 5
Descrieţi un transcodor BCD - 7 segmente folosind instrucţiunea case.
Indicaţie: Transcodorul binar – 7 segmente are la intrare un număr binar pe 4 biţi (care reprezintă o cifră zecimală) şi calculează la ieşire 7 semnale logice, care comandă cele 7 segemente ale unui afişaj Dispozitiv de IO: Afișajul cu 7 segmente. Pentru numerele 10-15, vom comanda afişarea simbolului E (pentru eroare).
Exemplul 6
Descrieţi în Verilog un circuit care incrementează numărul de la intrare (pe patru biţi) numai dacă intrarea de comandă este 1.
Temă
- Descrieţi un multiplexor cu 2 biţi de selecţie folosind
- instrucţiunea assign condiţionată;
- instrucţiunea assign şi expresii logice.
- Modificaţi exemplul 5, considerând că intrarea este o cifră hexazecimală. Indicaţie: Pentru valorile 9-15 pe intrare nu se va afişa eroare (E), ci cifrele corespunzătoare din baza 16, simbolizate cu A, b, C, d, E, F.
- Descrieţi în Verilog o schemă care conţine circuitul incrementator (din exemplul 6) şi transcodorul binar - 7 segmente (din exemplul 5). Simulaţi funcţionarea acestui circuit.
Reguli de bună practică
Pentru case se scrie întotdeauna şi cazul default, chiar dacă am precizat toate configuraţiile binare posibile (aceasta se face pentru cazul în care valoarea expresiei nu este cunoscută, sau altfel spus are "valoarea" x).