CID Seminar 3: Diferență între versiuni

De la WikiLabs
Jump to navigationJump to search
(Pagină nouă: Î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...)
 
Fără descriere a modificării
 
(Nu s-au afișat 57 de versiuni intermediare efectuate de alți 2 utilizatori)
Linia 1: Linia 1:
În acest seminar veţi învăţa ce este un ciruit secevențial și cum se descrie acesta în Verilog.
În acest seminar veţi învăţa ce este un circuit secevențial și cum se descrie acesta în Verilog.


'''Cuvinte cheie''': ''clock'', ''flip-flop'', circuit ''sincron''/ ''asincron'', atribuire ''blocking''/ ''non-blocking''
'''Cuvinte cheie''': ''clock'', ''bistabil (flip-flop)'', atribuire ''blocking''/ ''non-blocking'', hazard


'''Sintaxă Verilog''': ''always'', ''initial'', ''forever''
'''Sintaxă Verilog''': ''always'', ''initial'', ''forever''


Circuitele digitale pot fi de două tipuri:  
Circuitele digitale sunt 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 logice combinaționale (CLC)''' - 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''
# '''circuite secvențiale''' - pot fi descrise folosind doar procese de tip ''always''


==Exemplul 1==
==Exerciţiul 1==
Descrieţi în Verilog un bistabil D cu următoarele caracteristici:
* semnal de ceas activ pe frontul pozitiv
* semnal de reset sincron cu ceasul, activ pe palierul de 0


Descrieți în Verilog circuitul din figura 1, folosind o instrucțiune ''assign'', respectiv un proces ''always''.
<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 acest exemplu are următoarele porturi:
* Clk – intrarea de ceas, activă pe frontul pozitiv
* D – intrarea de date
* nReset – intrare 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)]]
 
'''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!!!


<u>Explicaţie suplimentară</u>
<div class="regula">
<div class="regula">
Când utilizați '''assign''' - semnalul trebuie declarat de tip '''wire'''.
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.


Când utilizați '''always''' sau '''initial''' - semnalul trebuie declarat de tip '''reg'''.
Î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>
</div>


==Exemplul 2==
==Exerciţiul 2==
 
Descrieți în Verilog un semnal de ceas cu perioada 6 unități de timp.
Simulaţi funcţionarea bistabilului D. Pe intrarea CK se va aplica un semnal periodic, cu perioada 6 unități de timp.


<u>Explicaţie suplimentară</u>
<u>Explicaţie suplimentară</u>


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:
Semnalul de ceas are următoarele proprietăți:
# Este semnal dreptunghiular (la fel ca toate celelalte semnale digitale)
# Este semnal dreptunghiular (la fel ca toate celelalte semnale digitale)
Linia 35: Linia 45:
<div class="regula">Modalitatea cea mai simplă prin care se poate genera un semnal de ceas în Verilog este folosind un proces '''initial''' și o buclă '''forever'''. După instrucțiunea '''forever''' nu se mai adaugă nici o instrucțiune, deoarece ea nu se va executa niciodată.</div>
<div class="regula">Modalitatea cea mai simplă prin care se poate genera un semnal de ceas în Verilog este folosind un proces '''initial''' și o buclă '''forever'''. După instrucțiunea '''forever''' nu se mai adaugă nici o instrucțiune, deoarece ea nu se va executa niciodată.</div>


==Exemplul 3==
==Exerciţiul 3==
 
Circuitul combinaţional din figura următoare are hazard pe ieşire. Descrieţi în Verilog acest circuit, folosind o instrucțiune ''assign'', respectiv un proces ''always'' şi apoi simulaţi funcţionarea lui, pentru a evidenţia hazardul.
 
[[Fișier:sem3_ex1.png|Figura 1 - Circuit logic combinațional (CLC)]]
 
<u>Explicaţie suplimentară</u>
   
   
se descrie în Verilog un bistabil D cu următoarele caracteristici:
<div class="regula">
* semnal de ceas activ pe frontul pozitiv
Când utilizați '''assign''' - semnalul trebuie declarat de tip '''wire'''.
* intrare de reset sincronă cu ceasul şi semnal de reset activ pe palierul de 0
 
Când utilizați '''always''' - semnalul trebuie declarat de tip '''reg'''.
</div>
 
Hazardul (comportament al circuitelor combinaţionale care nu este conform algebrei logice) se datorează timpilor de propagare prin porţile logice. Pentru a evidenţia acest fenomen, vom introduce timpii de propagare prin porţi cu sintaxa:
assign #tp ... , unde tp este timpul de propagare.
 
==Exerciţiul 4==


==Exemplul 4==
Descrieţi în Verilog circuitul din figura următoare şi simulaţi funcţionarea lui.


Să se descrie în Verilog un bistabil D cu următoarele caracteristici:
[[Fișier:sem3_ex5.png|Figura 3 - Un circuit secvențial]]
* semnal de ceas activ pe frontul negativ
* intrare de set asincronă cu ceasul și semnal de set activ pe palierul de 1


<u>Explicaţie suplimentară</u>
<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:
Circuitul poate fi descris în două moduri:
* Clk – intrarea de ceas, activă pe frontul pozitiv
* separând partea combinațională de cea secvențială (folosind 2 procese '''always''')
* D – intrarea de date
* folosind un singur proces '''always'''
* nReset – intrare asincronă/sincronă cu semnalul de ceas; nReset activ pe palierul de 0
Simularea va evidenţia eliminarea hazardului pe ieşire.
* Q – ieşirea circuitului
 
==Exerciţiul 5==


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.
Simulați și comparați funcţionarea următoarelor circuite (în cele două module diferă doar tipul de atribuire folosit: non-blocking, respectiv blocking):


Î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.
Circuitul 1:
<syntaxhighlight lang="verilog"> 
always@(posedge clk) begin
    if (nReset == 0) begin
        b <= 0;
        c <= 0;
    end else begin
        b <= a;
        c <= b;
    end
end
</syntaxhighlight>


'''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!!!
Circuitul 2:  
<syntaxhighlight lang="verilog">
always@(posedge clk) begin
    if (nReset == 0) begin
        b = 0;
        c = 0;
    end else begin
        b = a;
        c = b;
    end
end
</syntaxhighlight>


<div style="regula">
'''Observație''': Acest exemplu vă va ajuta să înţelegeţi regula enunţată anterior: Pentru descrierea circuitelor sincrone cu ceasul se folosește întotdeauna atribuirea non-blocking '''<='''.  
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 =).
<u>Explicatii suplimentare</u>
</div>


==Exemplul 5==
Diferenta intre tipul de atribuire blocking si cea non-blocking este următoarea: spre deosebire de atribuirea blocking (=), atribuirea non-blocking (<=) nu actualizeaza imediat semnalul reg din stânga, ci doar la sfârşitul pasului de simulare curent.


Descrieţi un transcodor BCD - 7 segmente folosind instrucţiunea ''case''.
Iata un exemplu: descrierea mai multor bistabili în procese diferite, folosind atribuirea blocking:
<syntaxhighlight lang="verilog">
always @(posedge clock)
    b = a;
always @(posedge clock)
    c = b;
</syntaxhighlight>
În acest caz particular, la sosirea unui front pozitiv al ceasului în simulare ambele procese sunt executate. Este însă imposibil de spus care va fi primul proces executat de simulator. Apar două cazuri posibile:


'''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]].
- Fie cele două procese sunt executate în ordinea în care au fost scrise. În acest caz, B va fi updatat primul şi noua valoare a lui B va fi folosită pentru a-l updata pe C. Deci B şi C vor avea aceeaşi valoare, mai exact valoarea A!
Pentru numerele 10-15, vom comanda afişarea simbolului E (pentru eroare).


==Exemplul 6==
- Fie cele două procese always vor fi executate în ordinea inversă. În acest caz, lui C i se va atribui vechea valoare a lui B, apoi B va fi updatat cu valoarea A.


Descrieţi în Verilog un circuit care incrementează numărul de la intrare (pe patru biţi) numai dacă intrarea de comandă este 1.
Astfel, pot apărea diferenţe între rezultatele obţinute în urma simulării folosind tool-uri de simulare diferite, dar pot apărea diferenţe şi între rezultatele simulării descrierii RTL şi a simulării post-layout!
Iata ce se intampla insa, daca implementam cei doi bistabili folosind atribuiri non-blocking:
<syntaxhighlight lang="verilog">
always @(posedge clock)
    b <= a;
always @(posedge clock)
    c <= b;
</syntaxhighlight>
In acest caz, B şi C nu primesc valori noi decât după cele ambele atribuiri au fost executate, adică pe frontul pozitiv următor! Astfel, schema ce va fi simulată va fi identică cu cea generată în urma sintezei codului RTL.


==Temă==
==Temă==


# Descrieţi un multiplexor cu 2 biţi de selecţie folosind
# Descrieţi în Verilog un numărător complet (in, reset, load, enable, up/down, out). Simulați funcţionarea acestui numărător. Considerați intrarile pe 4 biți. Evidențiați formele de unda de pe iesirea numaratorului! Ce observați? 
## instrucţiunea assign condiţionată;
# Descrieți și simulați funcționarea unui registru de deplasare la stânga, folosind operatorul de shiftare <<, respectiv cel de concatenare {}.
## instrucţiunea assign şi expresii logice.
# Descrieți și simulați funcţionarea unui registru de deplasare la stânga circular (MSB devine LSB).
# 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).

Versiunea curentă din 22 martie 2015 00:49

În acest seminar veţi învăţa ce este un circuit secevențial și cum se descrie acesta în Verilog.

Cuvinte cheie: clock, bistabil (flip-flop), atribuire blocking/ non-blocking, hazard

Sintaxă Verilog: always, initial, forever

Circuitele digitale sunt de două tipuri:

  1. circuite logice combinaționale (CLC) - pot fi descrise fie folosind instrucțiuni de tip assign, fie folosind procese de tip always
  2. circuite secvențiale - pot fi descrise folosind doar procese de tip always

Exerciţiul 1

Descrieţi în Verilog un bistabil D cu următoarele caracteristici:

  • semnal de ceas activ pe frontul pozitiv
  • semnal de reset sincron cu ceasul, 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 acest exemplu are următoarele porturi:

  • Clk – intrarea de ceas, activă pe frontul pozitiv
  • D – intrarea de date
  • nReset – intrare sincronă cu semnalul de ceas; nReset activ pe palierul de 0
  • Q – ieşirea circuitului

Figura 2 - Registru pe un bit (numit și bistabil D sau flip-flop)

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.

Î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 =).

Exerciţiul 2

Simulaţi funcţionarea bistabilului D. Pe intrarea CK se va aplica un semnal periodic, cu perioada 6 unități de timp.

Explicaţie suplimentară

Semnalul de ceas are următoarele proprietăți:

  1. Este semnal dreptunghiular (la fel ca toate celelalte semnale digitale)
  2. Este un semnal periodic
  3. Este singurul semnal dintr-un sistem digital care este activ pe front. Toate celelalte semnale prezente într-un sistem digital sunt active pe palier.
Modalitatea cea mai simplă prin care se poate genera un semnal de ceas în Verilog este folosind un proces initial și o buclă forever. După instrucțiunea forever nu se mai adaugă nici o instrucțiune, deoarece ea nu se va executa niciodată.

Exerciţiul 3

Circuitul combinaţional din figura următoare are hazard pe ieşire. Descrieţi în Verilog acest circuit, folosind o instrucțiune assign, respectiv un proces always şi apoi simulaţi funcţionarea lui, pentru a evidenţia hazardul.

Figura 1 - Circuit logic combinațional (CLC)

Explicaţie suplimentară

Când utilizați assign - semnalul trebuie declarat de tip wire.

Când utilizați always - semnalul trebuie declarat de tip reg.

Hazardul (comportament al circuitelor combinaţionale care nu este conform algebrei logice) se datorează timpilor de propagare prin porţile logice. Pentru a evidenţia acest fenomen, vom introduce timpii de propagare prin porţi cu sintaxa: assign #tp ... , unde tp este timpul de propagare.

Exerciţiul 4

Descrieţi în Verilog circuitul din figura următoare şi simulaţi funcţionarea lui.

Figura 3 - Un circuit secvențial

Explicaţie suplimentară

Circuitul poate fi descris în două moduri:

  • separând partea combinațională de cea secvențială (folosind 2 procese always)
  • folosind un singur proces always

Simularea va evidenţia eliminarea hazardului pe ieşire.

Exerciţiul 5

Simulați și comparați funcţionarea următoarelor circuite (în cele două module diferă doar tipul de atribuire folosit: non-blocking, respectiv blocking):

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: Acest exemplu vă va ajuta să înţelegeţi regula enunţată anterior: Pentru descrierea circuitelor sincrone cu ceasul se folosește întotdeauna atribuirea non-blocking <=.

Explicatii suplimentare

Diferenta intre tipul de atribuire blocking si cea non-blocking este următoarea: spre deosebire de atribuirea blocking (=), atribuirea non-blocking (<=) nu actualizeaza imediat semnalul reg din stânga, ci doar la sfârşitul pasului de simulare curent.

Iata un exemplu: descrierea mai multor bistabili în procese diferite, folosind atribuirea blocking:

always @(posedge clock)
    b = a;
always @(posedge clock)
    c = b;

În acest caz particular, la sosirea unui front pozitiv al ceasului în simulare ambele procese sunt executate. Este însă imposibil de spus care va fi primul proces executat de simulator. Apar două cazuri posibile:

- Fie cele două procese sunt executate în ordinea în care au fost scrise. În acest caz, B va fi updatat primul şi noua valoare a lui B va fi folosită pentru a-l updata pe C. Deci B şi C vor avea aceeaşi valoare, mai exact valoarea A!

- Fie cele două procese always vor fi executate în ordinea inversă. În acest caz, lui C i se va atribui vechea valoare a lui B, apoi B va fi updatat cu valoarea A.

Astfel, pot apărea diferenţe între rezultatele obţinute în urma simulării folosind tool-uri de simulare diferite, dar pot apărea diferenţe şi între rezultatele simulării descrierii RTL şi a simulării post-layout! Iata ce se intampla insa, daca implementam cei doi bistabili folosind atribuiri non-blocking:

always @(posedge clock)
    b <= a;
always @(posedge clock)
    c <= b;

In acest caz, B şi C nu primesc valori noi decât după cele ambele atribuiri au fost executate, adică pe frontul pozitiv următor! Astfel, schema ce va fi simulată va fi identică cu cea generată în urma sintezei codului RTL.

Temă

  1. Descrieţi în Verilog un numărător complet (in, reset, load, enable, up/down, out). Simulați funcţionarea acestui numărător. Considerați intrarile pe 4 biți. Evidențiați formele de unda de pe iesirea numaratorului! Ce observați?
  2. Descrieți și simulați funcționarea unui registru de deplasare la stânga, folosind operatorul de shiftare <<, respectiv cel de concatenare {}.
  3. Descrieți și simulați funcţionarea unui registru de deplasare la stânga circular (MSB devine LSB).