Diferență între revizuiri ale paginii „CID Seminar 3”
Linia 28: | Linia 28: | ||
* semnal de ceas activ pe frontul pozitiv | * semnal de ceas activ pe frontul pozitiv | ||
* intrare de reset sincronă cu ceasul şi semnal de reset activ pe palierul de 0 | * intrare de reset sincronă cu ceasul şi semnal de reset activ pe palierul de 0 | ||
+ | |||
+ | <u>Explicaţie suplimentară</u> | ||
+ | |||
+ | Circuitul cel mai des folosit pentru a sincroniza un semnal oarecare cu ceasul este bistabilul D (numit și flip-flop FF). Bistabilul D din exemplul 3 are următoarele porturi: | ||
+ | * Clk – intrarea de ceas, activă pe frontul pozitiv | ||
+ | * D – intrarea de date | ||
+ | * nReset – intrare asincronă/sincronă cu semnalul de ceas; nReset activ pe palierul de 0 | ||
+ | * Q – ieşirea circuitului | ||
+ | |||
+ | [[Fișier:sem3_ex4.png|Figura 2 - Registru pe un bit (numit și bistabil D sau flip-flop)]] | ||
+ | |||
+ | Faptul că nReset e o intrare asincronă cu ceasul, în contextul procesului '''always''', înseamnă că atunci când nReset devine activ (adică 0), indiferent de valoarea prezentă pe intrarea de date D, ieşirea circuitului va deveni 0 instantaneu. | ||
+ | |||
+ | În schimb, dacă nReset e o intrare sincronă cu ceasul, în contextul procesului '''always''', acest lucru înseamnă că, atunci când nReset devine activ (adică 0), indiferent de valoarea prezentă pe intrarea de date D, ieşirea circuitului va deveni 0 doar în momentul când apare frontul activ al ceasului. | ||
+ | |||
+ | '''Observație''': Semnalul de reset va fi întotdeauna sincron cu ceasul, adica își va schimba valoarea din 1 în 0 sau invers întotdeauna pe frontul activ al ceasului!!! | ||
+ | |||
+ | <div class="regula"> | ||
+ | Descrierea unui bistabil în Verilog la nivel RTL este posibilă doar folosind procese de tip always, având în lista de sensitivități cel puțin frontul pozitiv al ceasului. | ||
+ | |||
+ | Mai mult, în procesele cu ceas, se atribuie valori semnalelor folosind atribuirea de tip non-blocking (cu operatorul <=, care în acest context înseamnă "ia valoarea", şi NU mai mic sau egal!!!), spre deosebire de procesele '''always''' ce descriu circuite pur combinaționale și unde atribuirea de valori noi se face folosind doar atribuirea de tip blocking (cu operatorul =). | ||
+ | </div> | ||
==Exemplul 3== | ==Exemplul 3== |
Versiunea de la data 19 martie 2014 07:31
În acest seminar veţi învăţa ce este un ciruit secevențial și cum se descrie acesta în Verilog.
Cuvinte cheie: clock, flip-flop, circuit sincron/ asincron, atribuire blocking/ non-blocking
Sintaxă Verilog: always, initial, forever
Circuitele digitale pot fi de două tipuri:
- circuite logice combinaționale (CLC) - sunt circuite asincrone - pot fi descrise fie folosind instrucțiuni de tip assign, fie folosind procese de tip always
- circuite secvențiale - sunt circuite sincrone cu ceasul - pot fi descrise folosind doar procese de tip always
Exemplul 1
Descrieți în Verilog un semnal de ceas cu perioada 6 unități de timp.
Explicaţie suplimentară
Pe ieșirile unui CLC poate să apară hazard. Pentru a elimina hazardul, ieșirile unui CLC pot fi sincronizate cu un semnal suplimentar, numit semnal de ceas (clock). Semnalul de ceas are următoarele proprietăți:
- Este semnal dreptunghiular (la fel ca toate celelalte semnale digitale)
- Este un semnal periodic
- Este singurul semnal dintr-un sistem digital care este activ pe front. Toate celelalte semnale prezente într-un sistem digital sunt active pe palier.
Exemplul 2
Să se descrie în Verilog un bistabil D cu următoarele caracteristici:
- semnal de ceas activ pe frontul pozitiv
- intrare de reset sincronă cu ceasul şi semnal de reset activ pe palierul de 0
Explicaţie suplimentară
Circuitul cel mai des folosit pentru a sincroniza un semnal oarecare cu ceasul este bistabilul D (numit și flip-flop FF). Bistabilul D din exemplul 3 are următoarele porturi:
- Clk – intrarea de ceas, activă pe frontul pozitiv
- D – intrarea de date
- nReset – intrare asincronă/sincronă cu semnalul de ceas; nReset activ pe palierul de 0
- Q – ieşirea circuitului
Faptul că nReset e o intrare asincronă cu ceasul, în contextul procesului always, înseamnă că atunci când nReset devine activ (adică 0), indiferent de valoarea prezentă pe intrarea de date D, ieşirea circuitului va deveni 0 instantaneu.
În schimb, dacă nReset e o intrare sincronă cu ceasul, în contextul procesului always, acest lucru înseamnă că, atunci când nReset devine activ (adică 0), indiferent de valoarea prezentă pe intrarea de date D, ieşirea circuitului va deveni 0 doar în momentul când apare frontul activ al ceasului.
Observație: Semnalul de reset va fi întotdeauna sincron cu ceasul, adica își va schimba valoarea din 1 în 0 sau invers întotdeauna pe frontul activ al ceasului!!!
Descrierea unui bistabil în Verilog la nivel RTL este posibilă doar folosind procese de tip always, având în lista de sensitivități cel puțin frontul pozitiv al ceasului.
Mai mult, în procesele cu ceas, se atribuie valori semnalelor folosind atribuirea de tip non-blocking (cu operatorul <=, care în acest context înseamnă "ia valoarea", şi NU mai mic sau egal!!!), spre deosebire de procesele always ce descriu circuite pur combinaționale și unde atribuirea de valori noi se face folosind doar atribuirea de tip blocking (cu operatorul =).
Exemplul 3
Descrieți în Verilog circuitul din figura 1, folosind o instrucțiune assign, respectiv un proces always.
Explicaţie suplimentară
Când utilizați assign - semnalul trebuie declarat de tip wire.
Când utilizați always sau initial - semnalul trebuie declarat de tip reg.
Exemplul 5
Să se descrie în Verilog circuitul din figura 3 în două moduri:
- separând partea combinațională de cea secvențială (folosind 2 procese always)
- folosind un singur proces always
Exemplul 6
Descrieți în Verilog un numărător cu intrare de reset sincronă cu ceasul, reset activ pe palierul de 0 şi enable sincron cu ceasul și activ pe 1.
Exemplul 7
Scrieți 3 testbench-uri, pentru a putea simula funcționarea pentru: un bistabil / circuitul din exemplul 5/ circuitul din exemplul 6.
Exemplul 8
Simulați și comparați următoarele circuite (refolosiți un testbench din exemplul 7):
Circuitul 1:
always@(posedge clk) begin
if (nReset == 0) begin
b <= 0;
c <= 0;
end else begin
b <= a;
c <= b;
end
end
Circuitul 2:
always@(posedge clk) begin
if (nReset == 0) begin
b = 0;
c = 0;
end else begin
b = a;
c = b;
end
end
Observație: Pentru descrierea circuitelor sincrone cu ceasul se folosește întotdeauna atribuirea non-blocking <=.
Exemplul 9
Comparați funcționarea unui bistabil descris folosind un proces always care are lista de sensitivități de forma: (posedge clock, nReset) cu cea a unui bistabil descris folosind un proces always care are lista de sensitivități de forma: (posedge clock, negedge nReset). Ce diferențe observați în simularea celor doi bistabili?
Temă
- Descrieți în Verilog și simulați un circuit de numărare folosind un bistabil cu intrare de Set asincronă cu ceasul şi activă pe palierul de 1 și intrare de Load sincronă cu ceasul, activă pe palierul de 1. Când Load este activ, numărătorul se încarcă cu o valoare Data_In.
- Descrieți și simulați funcționarea unui registru de deplasare la stânga, folosind operatorul de shiftare <<, respectiv cel de concatenare {}.
- Descrieți și simulați un registru de deplasare la stânga circular (MSB devine LSB).