Sunteți pe pagina 1din 96

Curs 03

Modelarea HDL a
circuitelor secvenţiale:
bistabile, registre
Modelarea HDL a blocurilor
de memorii

1
Circuitul secvenţial
intrari control

intrari date
f (..., tCO) iesiri date
intrari iniţializare

intrare ceas circuit secvenţial întârzierea introdusă de circuit

ecuaţia de iesiri_date  f  strare , intrari,tCO 


funcţionare:
 conţin bucle de reacţie  au stări interne;
 valorile semnalelor de iesire sunt atribuite pe baza valorilor curente ale intrărilor precum şi a stării
curente a circuitului;
 valorile semnalelor de iesire devin valide după un interval de timp tCO, măsurat faţă de frontul activ al
semnalului de ceas, timp denumit CLOCK TO OUTPUT TIME ;
 întîrzierea introdusă de circuit depinde de:
• structura acestuia,
• modul de implementare pe suport fizic,
• suportul fizic adoptat pentru implementare (ASIC – întîrzieri minime, FPGA)
2
Circuitul secvenţial
intrari control

intrari date
f (..., tCO) iesiri date
intrari iniţializare

intrare ceas circuit secvenţial

Intrare ceas Intrări iniţializare Intrări control


 Rol:  Rol: forţează intrarea circuitului în  Rol:
starea iniţială (starea în care trebuie
• sincronizează • stabileşte modul de
să treacă acesta, înainte de a începe
funcţionarea circuitelor prelucrare a datelor;
să-şi îndeplinească funcţia pentru
secvenţiale;
care a fost proiectat; • controlează tranziţia
• stabileşte momentul de între stărille circuitului
 Tipuri de semnal iniţializare:
timp în care starea
 sunt semnale SINCRONE.
circuitului se actualizează • asincron,
(pe front pozitiv, sau pe  Exemple:
• sincron
front negativ), respectiv pe
• activare,
palier (pentru latch-uri)  Exemple:
• set, • control date = încărcare,
• reset; deplasare, sens numărare,
etc.;
3
Cerinţe pentru semnalele de intrare SINCRONE
 valoarea aplicată pe intrarea de date/control trebuie să
fie menţinută stabilă (nemodificată) pentru un anumit ceas:
interval de timp, înainte şi după momentul apariţiei
frontului activ al semnalului de ceas; data intrare:
data stabilă
 intervalul de timp măsurat înainte de apariţia frontului activ al
semnalului de ceas cât data de intrare trebuie să fie menţinută
stabilă se numeşte timp de stabilire (setup time);
 intervalul de timp măsurat după apariţia frontului activ al
semnalului de ceas cît data de intrare trebuie menţinută stabilă se setup time hold time (timp
numeşte timp de menţinere (hold time) (timp stabilire) menţinere)
 suma celor 2 intervale de timp = intervalul de timp cât data de timp
intrare trebuie menţinută stabilă în jurul frontului activ al apertură
semnalului de ceas se numeste timp de apertură.

 dacă nu se respectă această cerintă, circuitul secvenţial intră într-un


comportament metastabil (tensiunea care reprezintă ieşirea circuitului
se stabileşte pentru un anumit interval de timp la o valoare între cele
două praguri de valori care definesc biţii 0 respectiv 1; după acest
interval de timp bistabilul ia o decizie, iar ieşirea sa trece în una din cele
2 valori binare (0 sau 1) sau comportament oscilant (valoarea ieşirii
suferă modificări succesive între cele două valori binare 0, respectiv 1);

4
Cerinţe pentru semnalul de iniţializare ASINCRONE

 la DEZACTIVAREA semnalului de iniţializare


ASINCRON, sistemul secvenţial are nevoie de un anumit ceas:
interval de timp, considerat dupa momentul dezactivarii
semnalului asincron, în care se recupereaza. reset:

 in acest interval de timp, starea sistemului nu trebuie sa fie activ inactiv


modificata prin aparitia frontului activ al semnalului de ceas;
tRR
 intervalul de timp măsurat înainte de apariţia frontului activ
al semnalului de ceas, în care semnalul de iniţializare asincron
trebuie să fie stabil, se numeşte timp de recuperare (reset tRR = reset recovery time (timp de recuperare
recovery time); dupa reset)

 dacă nu se respectă această cerintă (momentul in care


apare frontul activ al semnalului de ceas este in intervalul de
recuperare, circuitul secvenţial intră într-un comportament
metastabil;

5
Semnale asincrone vs. semnale sincrone
Cazul semnalelor asincrone
starea circuitului se modifică la activarea
ceas: semnalului asincron; tranziţia între stări
depinde doar de semnalul asincron, fiind
semnal asincron: INDEPENDENTĂ de semnalul de ceas

stare circuit: stare veche stare nouă

Cazul semnalelor sincrone

A ceas: starea circuitului se modifică la momentul


apariţiei frontului activ al semnalului de
ceas, dacă este activ semnalul sincron;
semnal sincron:

stare circuit: stare veche stare nouă

B starea circuitului nu se modifică dacă


durata în care semnalul sincron este
semnal sincron: activ nu “prinde” niciun front activ al
comanda semnalului de ceas: activarea semnalului
ingnorată
sincron este ignorată în acest caz => nu
are efect asupra stării circuitului 6
stare circuit: stare veche
Tehnici de modelare a circuitelor secvenţiale

Modelarea Modelarea dataflow Modelarea structurală


comportamentală  se realizează pe ecuaţiilor  Se realizează pe baza porţilor
 se realizează pe baza logice (booleene), care descriu logice;
blocului always funcţionarea unui circuit
 În Verilog porţile logice sunt
secvenţial;
 descrie comportmentul furnizate ca primitive logice
circuitului secvenţial, făcând predefinite pe care utilizatorul le
abstracţie de schema poate utiliza folosind sintaxa
electronică a acestuia; acestora;
 descriere abstractă a
circuitului secvenţial;
 reprezintă tehnica de
modelare a circuitelor
secvenţiale utilizată în cadrul
acestei discipline

7
Reguli generale pentru modelarea
comportamentală a circuitelor secvenţiale

1. Este obligatoriu ca în lista de senzitivităţi a blocului always să fie introduse NUMAI


semnalul de CEAS ŞI (daca exista) semnalele ASINCRONE;
2. Controlul evenimentelor în lista de senzitivităţi se face numai pe front:
 se utilizeată elementul de control temporal @ împreună cu:
 calificatorul posedge(...) pentru front activ = pozitiv;
 calificatorul negedge(...) pentru front activ = negativ;
3. În cazul modelării latch-ului, controlul evenimentelor în lista de senzitivităţi se face
cu controlul @(ceas, intrari_date)
4. Pentru atribuirea valorilor se utilizează instrucţiunea de atribuire NEBLOCANTĂ <=

8
ERORI: utilizarea instrucţiunilor de atribuire
BLOCANTE în modelarea sistemelor secvenţiale =>
RACE CONDITION
// oscilator // oscilator
module c03Race (input clk, rst, output module c03ok (input clk, rst, output
reg q, qbar); reg q, qbar);
// proces 1
always @ (posedge clk, posedge rst) always @ (posedge clk, posedge rst)
if (rst) if (rst)
q = 1'b0; q <= 1'b0;
else else
q = qbar; q <= qbar;
// proces 2
always @ (posedge clk, posedge rst) always @ (posedge clk, posedge rst)
if (rst) if (rst)
qbar = 1'b1; qbar <= 1'b1;
else else
qbar = q; qbar <= q;

endmodule endmodule

Simulare: proces 1 preceda proces 2

Simulare: proces 2 preceda proces 1

9
ERORI: generarea semnalelor multisursă => RACE
CONDITION

module c03Race02 (clk, rst_n, d1, d2, q);

input clk, rst_n, d1, d2;


output reg q;

always @(posedge clk or negedge rst_n)


if (!rst_n) q <= 1'b0;
else q <= d1;

always @(posedge clk or negedge rst_n)


if (!rst_n) q <= 1'b0;
else q <= d2;

endmodule

RACE CONDITION!

10
I. Modelarea bistabilelor

11
Bistabilul de tip D

intrare date d
q iesire date
intrare ceas clk

dff

 aplicaţii specifice:
1. element de stocare a informaţiei ceas:
2. element de întîrziere a transmisiei datei cu un interval de timp egal
cu 1 perioadă semnalului de ceas stare bistabil

3. altele
 comportament: la apariţia frontului activ al semnalului de ceas, data intervalul de timp cit data este stocata
prezentă pe intrarea de date este încărcată în bistabil; durata de stocare (memorata) este egal cu perioada semnalului de
(memorare) a datei este egală cu o perioadă a semnalului de ceas. ceas = nu există un control al duratei de stocare

12
Modelarea comportamentală a bistabilului D

module dff (clk, d, q); // bistabil de tip D


input clk; // intrare ceas; frontul activ este cel pozitiv
input d; // intrare date
output q; // iesire date

reg q; // deoarece valoarea lui q se atribuie


// intr-un bloc always

always @(posedge clk ) // in lista de senzitivitati se introduce


// doar semnalul de ceas

q <= d; // q preia valoarea d la aparitia frontului pozitiv


// q pastreaza valoarea pina la aparitia
// urmatorului front activ al semnalului de ceas
endmodule

13
Latch-ul de tip D

intrare date d
q iesire date
intrare ceas clk

Dlatch

 aplicaţii specifice:
ceas:
1. element de stocare a informaţiei
 comportament: pe durata palierului activ al
semnalului de ceas, data prezentă pe intrarea de date stare latch
este încărcată în bistabil; durata de stocare a datei în
latch este egală cu durata palierului inactiv al
semnalului de ceas.
intervalul de timp cit data este stocata
(memorata) este egal cu durata palierului
inactiv a semnalului de ceas

14
Modelarea comportamentală a latchului D

module Dlatch (clk, d, q); // Latch de tip D


input clk; // intrare ceas; palierul activ este 1
input d; // intrare date
output q; // iesire date

reg q; // deoarece valoarea lui q se atribuie


// intr-un bloc always

always @(clk or d) // in lista de senzitivitati se introduce


// semnalul de ceas si de date
// iar controlul evenimentului e pe palier

if (clk) q <= d; // q preia valoarea d la pe palier 1


// q pastreaza valoarea pe durata palierului incativ
endmodule

15
Modelarea comportamentală a bistabilului D –
introducerea semnalelor de iniţializare ASINCRONE

intrare date d
q iesire date
intrare initializare rst
intrare ceas clk dffr
Observaţii:
 semnalele de iniţializare asincrone se introduc în lista de senzitivităţi a blocului always;
 semnalele de iniţializare asincrone au prioritate maximă (logica prioritară se modelează cu IF)

module dffr (rst, clk, d, q); // bistabil de tip D cu reset asincron


input rst; // semnal de initializare asincron, activ in 1; forteaza
// starea initiala a bistabilului in 0 logic
input clk; // intrare ceas; frontul activ = pozitiv
input d; // intrare date
output q; // iesire date

reg q;
always @(posedge rst or posedge clk) // in lista de senzitivitati se introduce atit
// rst (asincron) cit si de ceas; in cazul in care
// semnalul rst este activ in 1, se foloseste posedge (.);
// daca ar fi fost activ in 0 se folosea negedge (.)
if (rst)
q <= 1’b0; // initializarea bistabilului
else
q <= d; // stocarea informatiei pe durata unei perioade a ceasului
16
endmodule
Sinteza logică şi implementarea bistabilului D cu reset asincron
Sinteza logică:

Bistabilul D nu este sintetizat la nivel de


porti logice deoarece este considerat
primitivă logică de către instrumentul
software de sinteză (obs. este valabilă
dacă instrumentul software utilizat face
parte din suita de instrumente software
destinate tehnologiei FPGA)

Implementare FPGA:

Pentru implementare se utilizează un bistabil de tip D; aceste bistabile


sunt integrate în structura FPGA; un bistabil D şi un bloc LUT
compun structura de bază a unei Celule Logice din structura FPGA 17
Modelarea comportamentală a bistabilului D –
introducerea semnalelor de iniţializare ASINCRONE

Observaţie legată de semnalul de iniţializare:


 în cazul în care funcţia utilizată în lista de senzitivităţi nu este corelată cu testul instrucţiunii IF atunci
codul obţinut nu este sintetizabil (dar poate fi simulat)

...... ......
always @(negedge(rst) or posedge(clk)) always @(posedge(rst) or posedge(clk))

if (rst) q <= 1’b0; if (!rst) q <= 1’b0;

..... .....

coduri nesintetizabile

18
Modelarea comportamentală a bistabilului D –
introducerea semnalelor de iniţializare SINCRONE
Observaţii:
 semnalele de iniţializare sincrone NU se introduc în lista de senzitivităţi a blocului always;
 semnalele de iniţializare sincrone au prioritate maximă (logica prioritară se modelează cu IF)

module dffr (rst, clk, d, q); // bistabil de tip D cu reset sincron


input rst; // semnal de initializare sincron, activ in 1; forteaza
// starea initiala a bistabilului in 0 logic
input clk; // intrare ceas; front activ = pozitiv
input d; // intrare date
output reg q; // iesire date

always @(posedge(clk)) // in lista de senzitivitati se introduce numai semnalul de ceas


if (rst)
q <= 1’b0; // initializarea bistabilului (sincron cu frontul activ)
else
q <= d; // stocarea informatiei pe durata unei perioade a ceasului
endmodule

19
Sinteza logică şi implementarea bistabilului D cu reset sincron
Sinteza logică:

pentru reset asincron intrarea a fost CLR


Implementare FPGA:

20
Modelarea comportamentală a bistabilului D –
introducerea a 2 semnale de iniţializare ASINCRONE
intrare date d
q iesire date
intrare initializare rst
intrare initializare set
intrare ceas clk dffrs

Observaţie: este necesar ca cele 2 semnale de initializare sa fie ordonate dupa o logica prioritara

module dffrs (rst, set, clk, d, q); // bistabil de tip D cu reset si set asincrone
input rst; // semnal de initializare asincron, activ in 1; forteaza
// starea initiala a bistabilului in 0 logic
input set; // semnal de initializare asincron, activ in 1; forteaza
// starea initiala a bistabilului in 1 logic
input clk; // intrare ceas; front activ = pozitiv
input d; // intrare date
output q; // iesire date

reg q;
// in lista de senzitivitati se introduce semnalul
// rst (asincron), set (asincron) cit si de ceas;

always @(posedge(rst) or posedge(set) or posedge(clk))

if (rst) // initializarea bistabilului: rst mai prioritar decit set


q <= 1’b0;
else if (set)
q <= 1’b1;
else
q <= d; 21
// stocarea informatiei pe durata unei perioade a ceasului
endmodule
Sinteza logică şi implementarea bistabilului D cu 2 semnale de initializare

Sinteza logică:

Implementare FPGA:

22
Modelarea comportamentală a bistabilului T

intrare date t
q iesire date
intrare initializare rst
intrare ceas clk tffr

Observaţii:
 semnalele de iniţializare asincrone se introduc în lista de senzitivităţi a blocului always;
 semnalele de iniţializare asincrone au prioritate maximă (logica prioritară se modelează cu IF)

module tffr (rst, clk, t, q); // bistabil de tip T cu reset asincron


input rst; // semnal de initializare asincron, activ in 1;
input clk; // intrare ceas; front activ = pozitiv
input t; // intrare date
output q; // iesire date
reg q;

always @(posedge(rst) or posedge(clk))


if (rst)
q <= 1’b0; // initializarea bistabilului
else if (t)
q <= ~q; // intrarea t=1 inverseaza starea bistabilului
endmodule

23
Sinteza logică şi implementarea bistabilului T
Sinteza logică:

Bistabilul T este
sintetizat pe baza
bistabilului D

Implementare FPGA:

pentru implementare
se utilizează bistabilul
D din structura Celule
Logice ale FPGAurilor

24
Introducerea semnalelor de control – semnalul de încărcare
(scriere)
controlează operaţiunea
de încărcare a datei

ld
intrare date d
q iesire date
intrare initializare rst
durata de stocare a datei
intrare ceas clk dffl
clk:

 semnalul de control ld (load) controlează ld:


operaţiunea de încărcare a datei de intrare în
bistabil;
 este un semnal sincron => data de intrare stare bistabil
este încărcată la activarea acestui semnal,
sincron cu frontul activ al semnalului de ceas
(la apariţia frontului activ al semnalului de
ceas); intervalul de timp cit data este
stocata (memorata) este egal cu
 durata de stocare a informaţiei: pînă la intervalul de timp intre 2 activari
primul front activ al semnalului de ceas în care ale semnalului ld, sincrone cu
frontul activ al semnalului de ceas
semnalul ld este activ din nou.
25
Modelarea comportamentală a bistabilului D cu încărcare

module dffl (rst, clk, ld, d, q); // bistabil de tip D cu reset asincron si incarcare
input rst; // semnal de initializare asincron, activ in 1; forteaza
// starea initiala a bistabilului in 0 logic
input clk; // intrare ceas; front activ = pozitiv
input ld; // intrare de incarcare activ in 1
input d; // intrare date
output reg q; // iesire date

always @(posedge(rst) or posedge(clk))


if (rst)
q <= 1’b0; // initializarea bistabilului
else if (ld) // stocarea informatiei este controlata de semnalul ld
q <= d; // clauza else nu mai este necesara!
endmodule

26
Sinteza logică şi implementarea bistabilului D cu incarcare
Sinteza logică:

Intrarea ld este aplicata la intrarea CE


(Clock Enable) a bistabilului de tip D

Implementare FPGA:

27
Generarea bistabilelor (registrelor) pipeline

În cazul în care un semnal este atât destinaţie cât şi sursă în cadrul aceluiaşi bloc always
ale cărui evenimente sunt controlate pe front, iar instructiunea de atribuire utilizată este
cea NEBLOCANTĂ, atunci se generează un bistabil suplimentar.

S-a dorit ca intrarea d să module reg_accidental (clk, d, q);


input clk; // intrare ceas
fie furnizată ieşirii q
input d; // intrare date
sincron cu frontul activ al output reg q; // iesire date
semnalului de ceas
(bistabil D) reg semnal_intern; // semnal intern

always @(posedge(clk))
begin
semnal_intern <= d; // semnalul intern este destinatie
q <= semnal_intern; // semnalul intern este sursa
end
endmodule

Circuitul obţinut după


sinteza logică:

28
În cazul în care se descrie în ACELAŞI modul logică
combinaţională şi sincronă, se recomandă să nu se mixeze
cele 2 tipuri de instrucţiuni de atribuire în interiorul aceluiaşi
bloc always
module c03Mixt (
input clk, rst, x, y, u, z,
output reg q);

// se declara un semnal intern tmp pentru modelarea logicii combinationale


reg tmp;

always @(posedge clk or posedge rst)


if (rst)
q <= 1'b0;
else
begin
tmp = (x & y)|(u & z);
q <= tmp;
end
endmodule 29
II. Modelarea regiştrilor
de date

30
Registre de date

Furnizează suport logic pentru funcţiile de:

1. stocare (memorare) date


2. procesare date (prioritate inferioară faţă de
funcţia de stocare

31
Funcţia de memorare a datelor
 datele memorate în registru sunt cele aplicate pe intrările de date
 durata memorării datelor în registru:
– Începe imediat după apariţia frontului activ al semnalului de ceas
– Se termină:
a. După o perioadă a semnalului de ceas:

CLK
data

durata memorare

a. După activarea semnalului de încărcare (LD)


CLK

LD

data

durata memorare
32
Funcţia de procesare a datelor – funcţia de deplasare
 deplasarea datelor se realizează prin inserarea unor biţi noi în data stocată:
deplasare stânga: echivalentă cu înmulţirea datei stocate cu puteri ale lui 2
deplasare dreapta: echivalentă cu împărţirea datei stocate cu puteri ale lui 2

 permite implementarea funcţiilor de conversie (necesare în implementarea protocoalelor de comunicaţie


SPI, I2C, etc):
paralel  serie (PS)
serie  paralel (SP)

in in

Tclk 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Tclk
2Tclk 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 1 2Tclk
3Tclk 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 3Tclk
4Tclk 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 4Tclk
5Tclk 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 5Tclk
6Tclk 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 6Tclk
7Tclk 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 7Tclk
8Tclk 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 8Tclk
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

out out
deplasare stânga deplasare dreapta 33
Funcţia de procesare a datelor – funcţia de rotire
rotirea datelor se realizează prin recircularea unui bit (a unui grup de biţi):
rotire stânga: bitul MSB se inserează în bitul LSB
rotire dreapta: bitul LSB se inserează în bitul MSB

permite generarea unor semnale defazate cu nTclk

Tclk 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 Tclk
2Tclk 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 2Tclk
3Tclk 3Tclk
0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0
4Tclk 4Tclk
0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
5Tclk 5Tclk
0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
6Tclk 6Tclk
0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
7Tclk 7Tclk
8Tclk 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0
8Tclk
9Tclk 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9Tclk
1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0

34
Registrul paralel-paralel

Încărcarea datelor în registru are loc paralel


(simultan pe toate intrările)
Furnizarea datelor din registru are loc paralel
(simultan pe toate ieşirile)
Utilizat pentru:
1. memorare date
2. deplasare date: se realizează prin inserare de biţi noi
3. rotire date: se realizează prin recircularea biţilor

35
Modelarea comportamentală a registrului paralel-paralel
N
intrare date d
N
q iesire date
intrare initializare rst
intrare ceas clk
rpp

module rpp (rst, clk, d, q); // registru PP parametrizabil pe N biti,


// cu incarcare paralela si iesire paralela

parameter N = 8; // dimensiunea N a registrului; N=8 in acest exemplu


// dimensiunea se poate modifica la instantierea modulului
input rst; // semnal de initializare asincron, activ in 1;
input clk; // intrare ceas
input [N-1:0] d; // intrare date (pe N biti)
output reg [N-1:0] q; // iesire date (pe N biti)

always @(posedge(rst) or posedge(clk))


if (rst)
q <={N{1’b0}}; // initializarea bistabilului
else
q <= d; // stocarea informatiei pe durata unei perioade a ceasului
endmodule

36
Sinteza logică şi implementarea registrului paralel paralel

Sinteza logică:

Registrul este sintetizat la nivel de bistabile de tip D

Implementare FPGA:

Pentru implementare se utilizează 8 bistabile de tip D din


componenţa Celulelor Logice integrate in structura FPGA

37
Modelarea comportamentală a registrului paralel-paralel cu
semnal de încărcare
semnal încărcare

N
ld
intrare date d
N
q iesire date
intrare initializare rst
intrare ceas clk
rppl
module rppl (rst, clk, ld, d, q); // registru PP parametrizabil pe N biti,
// cu incarcare paralela si iesire paralela
// cu control separat pentru functia de încărcare

parameter N = 8; // dimensiunea N a registrului; N=8 in acest exemplu


// dimensiunea se poate modifica la instantierea modulului
input rst; // semnal de initializare asincron, activ in 1;
input clk; // intrare ceas
input ld; // semnal de incarcare activ pe 1
input [N-1:0] d; // intrare date (pe N biti)
output reg [N-1:0] q; // iesire date (pe N biti)

always @(posedge(rst) or posedge(clk))


if (rst)
q <= {N{1’b0}}; // initializarea bistabilului
else if (ld)
q <= d; // stocarea informatiei pe durata unei perioade a ceasului

endmodule 38
Modelarea comportamentală a operaţiilor de deplasare,
respectiv de rotire a datelor în registre

Operaţia de deplasare:
 stânga: q <= {q[N-2:0], 1’b0};
 dreapta: q <= {1’b0, q[N-1:1]};

Operaţia de rotire:
 stânga: q <= {q[N-2:0], q[N-1]};
 dreapta: q <= {q[0], q[N-1:1]};

39
Registrul paralel-paralel cu semnal de încărcare si deplasare

semnal încărcare semnal deplasare

N ld sh
intrare date d N
q iesire date
intrare initializare rst
intrare ceas clk
rppsh

Observaţii:
 la un registru cu deplasare (sau rotire), operaţia de încărcare trebuie controlată prin
intermediul unui semnal de control;
 operaţia de încărcare are prioritate mai mare decât operaţia de deplasare
 deplasarea biţilor are loc doar la activarea semnalului de deplasare, sincron cu frontul activ
al semnalului de ceas
 în cazul în care registrul are funcţie de deplasare dar nu are semnal de deplasare, atunci
deplasarea datelor se realizează la fiecare front activ al semnalului de ceas

40
Modelarea comportamentală a registrului paralel-paralel cu
semnal de încărcare si deplasare
module Rppsh (rst, clk, ld, sh, d, q); // registru PP parametrizabil pe N biti,
// cu incarcare si iesire paralela
// cu control separat pentru functia de încărcare si
// functie de deplasare a datelor
parameter N = 8; // dimensiunea N a registrului; N=8 in acest exemplu
// dimensiunea se poate modifica la instantierea modulului
input rst; // semnal de initializare asincron, activ in 1;
input clk; // intrare ceas
input ld; // semnal de incarcare activ pe 1
input sh; // semnal de deplasare: 1 = deplasare stinga; 0 = deplasare dreapta
input [N-1:0] d; // intrare date (pe N biti)
output reg [N-1:0] q; // iesire date (pe N biti)

always @(posedge(rst) or posedge(clk))


if (rst)
q <= {N{1’b0}}; // initializarea bistabilului
else if (ld) // incarcarea datei in registru
q <= d;
else
case(sh) // deplasarea datelor
0: q <= {1’b0, q[N-1:1]}; // dreapta
1: q <= {q[N-2:0], 1’b0}; // stinga
default: q <= q; // memorare (redundant)
endcase
endmodule

41
Sinteza logică a registrului paralel paralel cu încărcare şi deplasare

Detaliu circuit: data deplasată se


funcţia de deplasare aplică la intrarea
este sintetizată pe unui registru paralel
baza unei reţele de paralel simplu
multiplexoare =
circuit de reacţie

circuitul obţinut
după etapa de
sinteză logică

Detaliu multiplexor:
fiecare mutiplexor
este sintetizat prin
intermediul unor
porţi logice 42
Implementarea FPGA a registrului paralel paralel cu încărcare şi deplasare

Circuitul implementat în FPGA

Detaliu: multiplexoarele sunt


implementate în blocurile LUT
din Celulele Logice

Detaliu LUT: implementarea


portilor logice la nivelul
blocurilor LUT

43
Regiştrii paralel-serie, respectiv serie-paralel

Registrul paralel - serie


 Comportament:
- încărcarea datelor în registru are loc paralel (simultan pe toate intrările)
- furnizarea datelor din registru are loc serial (ieşirea este pe 1 bit)
după încărcare,
- datele sunt deplasate în registru; deplasarea se poate face la fiecare front activ al
semnalului de ceas sau la comandă (la activarea unui semnal de control)

Registrul serie - paralel


 Comportament:
- încărcarea datelor în registru are loc serial = succesiv, câte 1 bit
- furnizarea datelor din registru are loc paralel = simultan pe toate ieşirile
- datele sunt deplasate în registru; deplasarea se poate face la fiecare front activ al
semnalului de ceas sau la comandă (la activarea unui semnal de control)

Aplicaţii specifice:
- conversia datelor pentru implementarea protocoalelor de comunicaţii seriale

44
Aplicaţie specifică pentru regiştrii paralel-serie, respectiv serie-paralel:
transmisia datelor pe 1 singur bit

bloc transmisie date bloc transmisie recepţie

canal de comunicaţii pe 1 bit


bloc bloc
prelucrare
registru registru prelucrare
date paralel serie date
serie paralel

Data de intrare Dezpachetarea Data de ieşire Data de intrare Împachetarea Data de ieşire
în registru este datelor: după din registru în registru este datelor: după din registru
reprezentată în încarcarea este reprezentată încărcarea este
format paralel datelor, reprezentată pe pe 1 singur bit; datei, aceasta reprezentată
(8 biţi); este registrul le 1 bit deoarece este preluat de este deplasată paralel pe 8 biţi;
preluată de la deplasează protocolul de pe canalul de în scopul este trimisă în
ieşirea blocului pentru a le comunicaţii comunicaţii formării continuare unui
de prelucrare a transmite trimite datele pachetului nou bloc de
datelor succesiv pe serial, pe 1 bit (cuvîntului) de prelucrare a
canalul de date datelor
comunicaţii

45
Modelarea comportamentală a registrului paralel-serie
N
intrare date d
q iesire date
intrare initializare rst
intrare ceas clk
rps

module rps (rst, clk, ld, d, q); // registru PS parametrizabil pe N biti,


// cu incarcare paralela si iesire serie

parameter N = 8; // dimensiunea N a registrului; N=8 in acest exemplu


// dimensiunea se poate modifica la instantierea modulului
input rst; // semnal de initializare asincron, activ in 1;
input clk; // intrare ceas
input ld; // intrare incarcare
input [N-1:0] d; // intrare date (pe N biti)
output q; // iesire date (pe 1 bit)

reg [N-1:0] tmp; // semnal intern; are rolul de a stoca data pe N biti

always @(posedge(rst) or posedge(clk))


if (rst)
tmp <= {N{1’b0}}; // initializarea bistabilului
else if (ld)
tmp <= d; // încărcarea informatiei
else
tmp <= {tmp[N-2:0],1’b0}; // deplasarea datei pentru dezpachetarea sa

assign q = tmp[N-1]; 46tmp


// iesirea este preluata de la bitul MSB a semnalului
endmodule
Sinteza logică a registrului paralel serie
Comanda de încărcare este
sintetizată pe baza unei porţi
logice ŞI cărei i se aplică la
intrare semnalul ld si data
de intrare

funcţia de deplasare a
datelor este implementată
prin intermediul unei reţele
de multiplexoare, rezultatul
fiind apoi aplicat unui
registru paralel paralel

Sinteza logică a registrului


paralel paralel
47
Implementarea FPGA a registrului paralel serie

8 bistabile D

Blocurile LUT sunt utilizate pentru implementarea reţelei de multiplexoare


48
Modelarea comportamentală a registrului serie-paralel

intrare date d
N
q iesire date
intrare initializare rst
intrare ceas clk
rsp

module rsp (rst, clk, ld, d, q); // registru SP parametrizabil pe N biti,


// cu incarcare SERIE si iesire paralela

parameter N = 8; // dimensiunea N a registrului; N=8 in acest exemplu


// dimensiunea se poate modifica la instantierea modulului
input rst; // semnal de initializare asincron, activ in 1;
input clk; // intrare ceas
input ld; // intrare incarcare
input d; // intrare date (pe 1 bit)
output [N-1:0] q; // iesire date (pe N biti)

reg [N-1:0] tmp; // semnal intern; are rolul de a stoca data pe N biti

always @(posedge(rst) or posedge(clk))


if (rst)
tmp <= {N{1'b0}}; // initializarea bistabilului
else if (ld)
tmp [0] <= d; // încarcarea informatiei
else
tmp <= {tmp[N-2:0],1'b0}; // deplasarea datei pentru impachetarea sa

assign q = tmp; // iesirea este preluata de la semnalului tmp 49


endmodule
Sinteza logică a registrului serie paralel

Registrul este sintetizat pe baza a


8 bistabile D care îşi transmit unul
altuia data, funcţia de deplasare a
datelor fiind implementată în
acest mod

50
Implementarea FPGA a registrului serie paralel

8 bistabile D = reţea de întârziere; data este deplasată succesiv, la fiecare front activ al
semnalului de ceas, pentru un interval de timp egal cu 8Tclk

51
Modelarea comportamentală a registrului serie-serie

intrare date d
q iesire date
intrare initializare rst
intrare ceas clk
rss

module rss (rst, clk, ld, d, q); // registru SS parametrizabil pe N biti,


// cu incarcare serie si iesire serie

parameter N = 8; // dimensiunea N a registrului; N=8 in acest exemplu


// dimensiunea se poate modifica la instantierea modulului
input rst; // semnal de initializare asincron, activ in 1;
input clk; // intrare ceas
input ld; // intrare incarcare
input d; // intrare date (pe 1 bit)
output q; // iesire date (pe 1 bit)

reg [N-1:0] tmp; // semnal intern; are rolul de a stoca data pe N biti

always @(posedge(rst) or posedge(clk))


if (rst)
tmp <= {N{1'b0}}; // initializarea bistabilului
else if (ld)
tmp [0] <= d; // încarcarea informatiei a bitul LSB a semnalului tmp
else
tmp <= {tmp[N-2:0],1'b0}; // deplasarea datei pentru dezpachetarea sa

assign q = tmp[N-1]; 52tmp


// iesirea este preluata de la bitul MSB a semnalului
endmodule
Sinteza logică a registrului serie serie

Registrul este sintetizat pe baza a 8 bistabile D


care îşi transmit unul altuia data, formând o
reţea de întîrziere egală cu 8Tclk; întârzierea este
măsurată între momentul în care data este
încărcată în registru şi momentul în care aceasta
este furnizată la ieşirea registrului

53
Implementarea FPGA a registrului serie serie

8 bistabile D = reţea de întârziere; data este întârziată cu un interval de timp egal cu


8Tclk

54
Modelarea blocurilor de
memorie

55
Memoria ROM asincronă

 Observaţie: memoria ROM dispune numai de


N W funcţia de citire;
intrare adresa addr dout iesire date

romA

 Comportament:
adresa adresa valida operaţia de citire asicronă = pe ieşirea de date
dout se furnizează data memorată în locaţia de
memorie de la adresa care este egală cu valoarea
aplicată pe intrarea de adresă addr;
data data valida
furnizarea datei de ieşire are loc în momentul
aplicării adresei locaţiei de memorie citite (după o
întârziere numită timp de acces, notată tAA);
timp
acces
 Iniţializarea memoriei ROM:
memoria trebuie iniţializată cu valorile conţinute
în locaţiile sale:
1. iniţializarea memoriei prin utilizarea
instrucţiunii case;
2. iniţializarea memoriei prin utilizarea funcţiei
Verilog readmemb
56
Modelarea comportamentală a memoriei ROM asincrone –
iniţializarea memoriei prin utilizarea instrucţiunii case

Observaţie: acest model este adecvat descrierii blocurilor de memorie de dimensiuni reduse

// memorie ROM asincrona parametrizabila de capacitate (2**N x W)


// parametrii se pot modifica la instantierea modulului

module romA #(
parameter N = 3, // dimensiunea magistralei de adresă;
parameter W = 8) // dimensiunea cuvintului de memorie

( input [N-1:0] addr, // intrare adresa (dimensiunea bussului de adresa = N biti)


output reg [W-1:0] dout); // iesire date (dimensiunea cuvintului memorat = W biti)

always @ (addr)
case (addr)
0: dout = ’h F0; // F0 reprezinta valoarea stocata la adresa 0 a memoriei ROM
1: dout = ’h F1;
2: dout = ’h F2;
3: dout = ’h F3;
4: dout = ’h F4;
5: dout = ’h F5;
6: dout = ’h F6;
7: dout = ’h F7;
default: dout = {W{1’b0}};
endcase

endmodule

57
Sinteza logică şi implementarea memoriei ROM asincrone

Sinteza logică: instrumentul de sinteză implementează blocul descris în Verilog direct ca un bloc de
memorie ROM dacă este activată directiva de sinteză “ROM extraction”

Circuit generat dupa sinteza logica:

Implementare FPGA:

58
Modelarea comportamentală a memoriei ROM asincrone –
iniţializarea memoriei prin citirea unui fişier cu comanda
$readmemb
Observaţie: acest model este adecvat descrierii blocurilor de memorie de dimensiuni mari

// memorie ROM asincrona parametrizabila de capacitate 2**N x W


module romA #
(
parameter N = 3, // dimensiunea magistralei de adresă;
parameter W = 8) // dimensiunea cuvintului stocat in memorie
(
input [N-1:0] addr, // intrare adresa (dimensiunea bussului de adresa = N biti)
output [W-1:0] dout); // iesire date (dimensiunea cuvintului memorat = W biti)

localparam M = 2**N; // spatiul de memorie


reg [W-1:0] mem [0:M-1]; // declaratia matricii de date a memoriei

// initilizarea memoriei prin intermediul comenzii $readmemb

initial
$readmemb (“fisier_initializare_memorie”, mem);
assign dout = mem[addr]; // modelarea operatiei de citire asincrona

endmodule

$readmemb (“fisier_initializare_memorie”, mem);

fisier text care contine in matricea memoriei = data


format binar datele care care defineste continutul
urmeaza a fi memorate memoriei ROM
59
Memoria ROM sincronă

N W
intrare adresa addr dout iesire date
intrare ceas clk

romS

ceas  Comportament:
operaţia de citire sincronă = pe ieşirea de date
dout se furnizează data memorată în locaţia de
memorie a cărei adresă este egală cu valoarea
adresa adresa valida
aplicată pe intrarea de adresă addr;
ts th furnizarea datei de ieşire are loc la apariţia
frontului activ al semnalului de ceas clk (după o
întârziere numită timp de acces);
timp stabilire timp mentinere
furnizarea adresei pe linia de adresă addr
trebuie să respecte timpii de stabilire şi de
data data valida menţinere (trebuie menţinută stabilă pe perioada
timpului de stabilire şi de menţinere)

timp
acces  Iniţializarea memoriei: aceeaşi ca şi la memoria
ROM asincronă

60
Modelarea comportamentală a memoriei ROM sincrone –
iniţializarea memoriei prin utilizarea instrucţiunii case
Observaţie: acest model este adecvat descrierii blocurilor de memorie de dimensiuni reduse

// memorie ROM sincrona parametrizabila de capacitate (2**N x W)


// parametrii se pot modifica la instantierea modulului

module romS #(
parameter N = 3, // dimensiunea magistralei de adresă;
parameter W = 8) // dimensiunea cuvintului de memorie
(
input clk, // semnal de ceas, front activ = pozitiv
input [N-1:0] addr, // intrare adresa (dimensiunea bussului de adresa = N biti)
output reg [W-1:0] dout); // iesire date (dimensiunea cuvintului memorat = W biti)

always @ (posedge clk)


case (addr)
0: dout = ’h F0; // F0 reprezinta valoarea stocata la adresa 0 a memoriei ROM
1: dout = ’h F1;
2: dout = ’h F2;
3: dout = ’h F3;
4: dout = ’h F4;
5: dout = ’h F5;
6: dout = ’h F6;
7: dout = ’h F7;
default: dout = {W{1’b0}};
endcase

endmodule

61
Sinteza logică şi implementarea memoriei ROM sincrone

Sinteza logică: instrumentul de sinteză


implementează blocul descris în Verilog direct ca un
bloc de memorie ROM dacă este activată directiva
de sinteză “ROM extraction”; deoarece operatiunea
de citire este sincrona, iesirea blocului ROM este
durnizată unui registru cu încărcare paralela si iesire
paralela

Implementare FPGA: se
utilizează 3 bistabile de tip D
pentru implementarea registrului
paralel-paralel (deoarece
dimensiunea cuvîntului memorat
este N=3).

62
Memoria RAM cu scriere sincronă şi citire asincronă

 Operatia de scriere sincronă:


• scrierea datei în memorie are loc după apariţia
frontului activ al semnalului de ceas, cu condiţia
N ca semnalul we să fie activ în acel moment (we =
intrare adresa addr
1);
• valoarea aplicată pe intrare date di este scrisă în
W W
di dout locaţia de memorie a cărei adresă este egală cu
intrare date iesire date valoarea furnizată pe magistrala de adresă addr;
we • atât furnizarea datei de intrare di cât şi a
intrare ceas clk semnalului we trebuie să respecte timpii de
stabilire şi de menţinere (comanda trebuie
menţinută stabilă pe perioada timpului de stabilire
ramA şi de menţinere)

 Operatia de citire asincronă: pe ieşirea de date


dout se furnizează data memorată în locaţia de
memorie a cărei adresă este egală cu valoarea
aplicată pe intrarea de adresă addr;

 Furnizarea adresei: indiferent de tipul operatiei,


furnizarea adresei pe linia de adresă addr trebuie
să respecte timpii de stabilire şi de menţinere
(trebuie menţinută stabilă pe perioada timpului de
stabilire şi de menţinere)

63
Modelarea comportamentală a memoriei RAM cu citire
asincronă şi citire sincronă

// memorie RAM cu scriere sincrona si citire asincrona


module ramA #

( parameter N = 3, // dimensiunea magistralei de adresă;


parameter W = 8) // dimensiunea cuvintului de memorie

( input clk, // semnal de ceas


input we, // intrare activare operatie scriere
input [N-1:0] addr, // intrare adresa (dimensiunea bussului de adresa = N biti)
input [W-1:0] di, // intrare de date (dimensiunea cuvintului memorat = W biti)
output [W-1:0] dout); // iesire date (dimensiunea cuvintului memorat = W biti)

localparam M = 2**N; // spatiul de memorie


reg [W-1:0] mem [0:M-1]; // declaratia matricei de memorie in care se scriu datele

always @ (posedge clk) // operatia de scriere sincrona


if (we) //
mem[addr] <= di; //

assign dout = mem[addr]; // operatia de citire asincrona

endmodule

64
Sinteza logică şi implementarea memoriei RAM cu citire
asincronă şi citire sincronă
Sinteza logică: instrumentul de sinteză implementează
blocul descris în Verilog direct ca un bloc de memorie
RAM dacă este activată directiva de sinteză “RAM
extraction”.

Implementare FPGA: pentru


implementare se utilizează 8 blocuri de
memorie de 16x1 bit integrate în
structura FPGA

detaliu

65
Memoria RAM cu scriere sincronă şi citire sincronă

N
intrare adresa addr

W W  ambele operaţii se realizează sincron cu frontul


intrare date di dout iesire date activ al semnalului de ceas
we
intrare ceas clk

ramS

66
Modelarea comportamentală a memoriei ROM cu citire
asincronă şi citire sincronă

// memorie RAM cu scriere si citire sincrona


module ramS #

( parameter N = 3, // dimensiunea magistralei de adresă;


parameter W = 8) // dimensiunea cuvintului de memorie

( input clk, // semnal de ceas


input we, // intrare activare operatie scriere
input [N-1:0] addr, // intrare adresa (dimensiunea bussului de adresa = N biti)
input [W-1:0] di, // intrare de date (dimensiunea cuvintului memorat = W biti)
output reg [W-1:0] dout); // iesire date (dimensiunea cuvintului memorat = W biti)

localparam M = 2**N; // spatiul de memorie


reg [W-1:0] mem [0:M-1]; // declaratia matricei de memorie in care se scriu datele

always @ (posedge clk)


if (we)
mem[addr] <= di; // operatia de scriere sincrona
else
dout <= mem[addr]; // operatia de citire sincrona

endmodule

67
Sinteza logică a memoriei RAM cu citire sincronă şi citire
sincronă
instrumentul de sinteză implementează blocul descris în Verilog direct ca un bloc
de memorie RAM; deoarece citirea este sincronă, ieşirea de date a blocului RAM
este furnizată unui registru cu intrare paralelă şi ieşire paralelă

68
Implementarea FPGA a memoriei RAM cu citire sincronă şi
citire sincronă
Blocul de memorie este implementat pe baza blocurilor de memorie 16x1 iar registrul este implementat
prin intermediul bistabilelor de tip D; toate resursele logice utilizate sunt integrate în structura FPGA

detaliu

69
Modelarea întârzierilor tCO în circuitele secvenţiale
`timescale 1ns/100ps
module c03TCOGresit (input clk, d, output reg q);

always @(posedge clk)


#5 q <= d; // INCORECT!
// daca intrarea sufera o tranzitie, raportat la
ultimul //front activ, la un Dt < valoarea intirzierii,
atunci este
// filtrata
endmodule

`timescale 1ns/100ps
module c03TCOCorect (input clk, d, output reg q);

always @(posedge clk)


q <= #5 d; // CORECT

endmodule

70
Modelarea generatorului de semnal de ceas pentru
modelarea testbench-urilor

`timescale 1ns/10ps
module c03GenClock (output reg clkA, clkB, clkC, clkD);

// exemplul 1: nu oscileaza
initial clkA = 0;
always @(clkA) #10 clkA = ~clkA;

// exemplul 2: oscileaza
initial clkB = 0;
always @(clkB) #10 clkB <= ~clkB;

// exemplul 3: oscileaza
initial clkC = 0;
initial forever #10 clkC = ~clkC;

// exemplul 4: oscileaza
initial clkD = 0;
always forever #10 clkD <= ~clkD;

endmodule 71
Modelarea VHDL a
bistabilelor

72
Descrierea VHDL a bistabilului D
library ieee;
use ieee.std_logic_1164.all;
entity dff is
port (
clk : in std_logic;
d : in std_logic;
q : out std_logic);
end dff;

architecture beh of dff is


begin
process (clk) procesul este controlat NUMAI de
begin semnalul de ceas: nu este
if (rising_edge(clk)) then transparent la variaţiile datei de
q <= d; intrare
end if;
end process; comportamentul circuitului este
end beh; controlat de FRONTUL activ al
semnalului de ceas; pe frontul activ
Logica sincronă a al semnalului de ceas circuitul trece
circuitului într-o nouă stare, altfel rămâne în
vechea stare prin generarea unei 73
celule de memorie.
Descrierea VHDL a unui latch
library ieee;
use ieee.std_logic_1164.all;
entity d_latch is
port (
clk : in std_logic;
d : in std_logic;
q : out std_logic);
end d_latch;

architecture beh of d_latch is


begin
procesul este controlat de
process (clk,d)
semnalul de ceas ŞI de data de
begin
intrare: este transparent atât la
if (clk=’1’) then
variaţiile semnalului de ceas cât şi
q <= d;
ale datei de intrare
end if; tranziţia în noua stare se face pe
end process; PALIERUL activ al semnalului de ceas;
end beh; altfel, se rămâne în vechea stare prin
generarea unei celule de memorie.

74
Inserarea semnalelor de inţializare
SINCRONE
entity dff_rsinc is
port (
clk : in std_logic;
reset : in std_logic; semnal de
d : in std_logic;
q : out std_logic); iniţializare
end dff_rsinc;

architecture beh of dff_rsinc is


procesul este controlat NUMAI de
begin semnalul de ceas: procesul NU este
process (clk) transparent la variaţia semnalelor
begin sincrone (iniţializare circuitului
comportamentul şi data este
de
if (rising_edge(clk)) then intrare)
controlat de FRONTUL activ al
if (reset=’1’) then
semnalului de ceas
q <= ’0’;
else
semnalul de iniţializare este
q <= d; PRIORITAR
end if;
end if;
end process;
end beh;
descrie logica sincronă: controlată de
semnalul de ceas
75
Inserarea semnalelor de inţializare
ASINCRONE

architecture beh of dff_rasinc is


begin procesul este controlat de semnalul
process (clk, reset)
begin de ceas ŞI de semnalele de
iniţializare
if (reset=’1’) then
q <= ’0’; descrie logica ASINCRONĂ:
nu este controlată de semnalul
de ceas; este PRIORITARĂ
elsif (rising_edge(clk)) then
q <= d;

end if; descrie logica


end process;
end beh; SINCRONĂ: este
controlată de semnalul
de ceas

76
Inserarea a 2 semnalelor de
inţializare
architecture beh of dff_rpasinc is
begin
process (clk, reset, preset)
begin

if (reset=’1’) then logica ASINCRONĂ: se impune


q <= ’0’; pentru semnalele de iniţializare o
elsif (preset=’1’) then anumită prioritate (nu se
q <= ’1’; utilizează CASE)

elsif (rising_edge(clk)) then logica


.... SINCRONĂ
end if;

end process;
end beh;

77
Modelarea VHDL a
registrelor de date

78
Descrierea VHDL a registrului paralel-paralel

library ieee;
use ieee.std_logic_1164.all;
entity reg_p8 is date d q
generic (size: natural :=8);
port (
clk : in std_logic;
rst : in std_logic; -- asincron
d : in std_logic_vector (size-1 downto 0);
q : out std_logic_vector (size-1 downto 0));
end reg_p8;
sincronizare clk
architecture beh of reg_p8 is
begin iniţializare rst

process (clk, rst)


begin
if (rst=’1’) then logica ASINCRONĂ:
q <=(others=>’0’);

elsif (rising_edge(clk)) then


logica SINCRONĂ:
q <= d;
end if;
end process;
end beh;
79
Descrierea VHDL a registrului paralel-paralel cu
încărcare
library ieee; control
use ieee.std_logic_1164.all;
entity reg_p8 is
generic (size: natural :=8);
port ( date d ld q
clk : in std_logic;
rst : in std_logic; -- asincron
ld : in std_logic; -- sincron
d : in std_logic_vector (size-1 downto 0);
q : out std_logic_vector (size-1 downto 0));
end reg_p8;

architecture beh of reg_p8 is sincronizare clk


begin iniţializare rst
process (clk, rst)
begin
if (rst=’1’) then
logica
q <=(others=>’0’);
ASINCRONĂ:
elsif (rising_edge(clk)) then logica SINCRONĂ:
if (ld = ‘1’) then
q <= d; operaţia de încărcare a
end if;
datelor
end if;
end process; 80
end beh;
Descrierea VHDL a operaţiei de deplasare/rotire a
datelor în registre
1. se declară un semnal intern tmp care stochează starea curentă a
registrului:

2. în interiorul procesului care descrie comportamentul registrului


se descrie operaţia de deplasare/rotire

DEPLASARE STÂNGA 1 BIT:


tmp <= tmp(size-2 downto 0) & ’0’ ;
DEPLASARE DREAPTA 1 BIT :
tmp <= ’0’ & tmp(size-1 downto 1);

ROTIRE STÂNGA 1 BIT :


tmp <= tmp(size-2 downto 0) & tmp(size-1);
ROTIRE DREAPTA 1 BIT :
tmp <= tmp(0) & tmp(size-1 downto 1);

3. valoarea lui tmp se atribuie ieşirii registrului în exteriorul


procesului care descrie comportamentul registrului
81
Descrierea VHDL a unui registru de deplasare
stânga, fără semnal de control pentru deplasare

architecture beh of reg_p8 is


signal tmp : std_logic_vector(size-1 downto 0);
control
begin
process (clk, rst) begin
if (rst=’1’) then
tmp <=(others=>’1’); d ld q
elsif (rising_edge(clk)) then
if (ld = ‘1’) then
tmp <= d;
else
tmp <= tmp(size-2 downto 0) & ‘0’;
end if;
end if; clk
end process; rst
q <= tmp;
end beh;

Operaţia de deplasare se efectuază la


fiecare front activ al semnalului de
ceas, fără alt control

82
Descrierea VHDL a unui registru de deplasare
stânga, cu semnal de control pentru deplasare
control
architecture beh of reg_p8 is
signal tmp : std_logic_vector(size-1 downto 0);
begin
process (clk, rst) begin d ld sh q
if (rst=’1’) then
tmp <=(others=>’1’);
elsif (rising_edge(clk)) then
if (ld = ‘1’) then
tmp <= d;
elsif (sh = ‘1’) then
clk
tmp <= tmp(size-2 downto 0) & ‘0’;
end if; rst
end if;
end process;
q <= tmp;
end beh;

Operaţia de deplasare se efectuază la


fiecare front activ al semnalului de
ceas, sub controlul semnalului sh

83
Generarea accidentală a
registrelor

COD VHDL SCHEMA GENERATĂ DUPĂ


SINTEZA LOGICĂ

84
Sinteza blocurilor de
memorie

85
Tipuri de blocuri de
memorii
• ROM, RAM
• Single port; dual port
• Asincrone; sincrone

86
Soluţii pentru sinteza
blocurilor de memorie
• Descriere comportamentală şi
inferenţă
• Utilizarea resurselor FPGA-ului
dedicate blocurilor de memorie prin
instanţiere

87
Avantaje-dezavantaje
• Descriere comportamentală • Instanţiere resurse
şi inferenţă dedicate

• Cod portabil
• Nu necesită instrumente de • Soluţii optime
sinteză şi implementare • Pot fi generate toate tipurile
dedicate de memorii RAM

• Pot fi generate soluţii • Codul sursă nu este portabil,


neoptimizate fiind dependent de structura
• Nu există suport hardware FPGA-ului
pentru semnalul de activare a • Nu se pot controla parametrii
blocului de memorie RAM de timp (timing) şi arie
(enable)
• Necesită instrumente software
• generează blocuri RAM de proiectare dedicate.
distribuite

88
1. Memorie RAM single port cu citire
asincronă – entitatea
a
ADDR

WORD
di
WORD do

we
LIBRARY ieee;
USE ieee.std_logic_1164.all; clk
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;

entity RAM_SP is
generic ( WORD : integer := 16; -- WORD = dimensiune cuvânt memorie
ADDR : integer := 3); -- 2^ADDR_ = număr cuvinte RAM

port (clk : in std_logic;


we : in std_logic; -- comanda scriere; 1 = WRITE / 0=READ
a : in std_logic_vector(ADDR-1 downto 0);
di : in std_logic_vector(WORD-1 downto 0);
do : out std_logic_vector(WORD-1 downto 0));

end RAM_SP; 89
1. Memorie RAM single port cu citire asincronă -
arhitectura

architecture behavioral of RAM_SP is


type ram_type is array (2**ADDR-1 downto 0) of std_logic_vector (WORD-1 downto 0);
signal RAM : ram_type;
begin
process (clk)
begin
if (rising_edge(clk)) then
if (we = '1') then
RAM(conv_integer(a)) <= di; -- scriere sincrona
end if;
end if;
end process;
do <= RAM(conv_integer(a)); -- citire asincrona
end behavioral;

90
2. Memorie RAM single port cu citire sincronă –
entitatea
a
ADDR

WORD WORD
di
LIBRARY ieee; WORD do D
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all; we
USE ieee.std_logic_unsigned.all;
clk

entity RAM_SP is
generic ( WORD : integer := 16;
ADDR : integer := 3);
port (clk : in std_logic;
we : in std_logic;
a : in std_logic_vector(ADDR-1 downto 0);
di : in std_logic_vector(WORD-1 downto 0);
do : out std_logic_vector(WORD-1 downto 0));
end RAM_SP;

91
2. Memorie RAM single port cu citire sincronă -
arhitectura

architecture behavioral of RAM_SP is


type ram_type is array (2**ADDR-1 downto 0) of std_logic_vector
(WORD downto 0);
signal RAM : ram_type;
begin
process (clk)
begin
if (rising_edge(clk)) then
if (we = '1') then
RAM(conv_integer(a)) <= di;
end if;
do <= RAM(conv_integer(a)); -- citire sincronă
end if;
end process;

end behavioral;

92
3. Memorie dual port RAM cu citire asincronă –
entitate
ADDR WORD
awra doa

arb
ADDR

di
WORD
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; we
use ieee.std_logic_arith.all; WORD
clk dob
entity RAM_DP is
generic ( WORD : integer := 32;
ADDR : integer := 3);
port (clk : in std_logic;
we : in std_logic;
awra : in std_logic_vector(ADDR-1 downto 0);
arb : in std_logic_vector(ADDR-1 downto 0);
di : in std_logic_vector(WORD-1 downto 0);
doa : out std_logic_vector(WORD-1 downto 0);
dob : out std_logic_vector(WORD-1 downto 0)); 93
end RAM_DP;
3. Memorie dual port RAM cu citire asincronă -
arhitectură

architecture beh of RAM_DP is


type ram_type is array (2**ADDR-1 downto 0) of std_logic_vector (WORD downto 0);

signal RAM : ram_type;


begin
process (clk)
begin
if (rising_edge(clk)) then
if (we = '1') then
RAM(conv_integer(awra)) <= di;
end if;
end if;
end process;
doa <= RAM(conv_integer(awra));
dob <= RAM(conv_integer(arb));
end beh;

94
4. Memoria ROM - entitatea

a do
ADDR WORD

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;

entity ROM is
generic (
WORD : integer := 10; -- dimensiune cuvinte
ADDR : integer := 3); -- 2^ADDR = numar cuvinte
port (a : in std_logic_vector(ADDR-1 downto 0);
do : out std_logic_vector(WORD-1 downto 0));
end ROM;

95
4. Memoria ROM - arhitectura

architecture behavioral of ROM is


type rom_type is array (2**ADDR-1 downto 0) of std_logic_vector (WORD-1 downto 0);

constant ROM_DATA : rom_type :=


("0000110001",
"0100110100",
"0100110110",
"0110110000",
"0000111100",
"0111110101",
"0100110100",
"1111100111");
begin
do <= ROM_DATA(conv_integer(a));
end behavioral; `

96

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