Documente Academic
Documente Profesional
Documente Cultură
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
intrari date
f (..., tCO) iesiri date
intrari iniţializare
4
Cerinţe pentru semnalul de iniţializare ASINCRONE
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
7
Reguli generale pentru modelarea
comportamentală a circuitelor secvenţiale
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
9
ERORI: generarea semnalelor multisursă => RACE
CONDITION
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
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
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)
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ă:
Implementare FPGA:
...... ......
always @(negedge(rst) or posedge(clk)) always @(posedge(rst) or posedge(clk))
..... .....
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)
19
Sinteza logică şi implementarea bistabilului D cu reset sincron
Sinteza logică:
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;
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)
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:
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
26
Sinteza logică şi implementarea bistabilului D cu incarcare
Sinteza logică:
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.
always @(posedge(clk))
begin
semnal_intern <= d; // semnalul intern este destinatie
q <= semnal_intern; // semnalul intern este sursa
end
endmodule
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);
30
Registre de date
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
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
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
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
35
Modelarea comportamentală a registrului paralel-paralel
N
intrare date d
N
q iesire date
intrare initializare rst
intrare ceas clk
rpp
36
Sinteza logică şi implementarea registrului paralel paralel
Sinteza logică:
Implementare 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
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
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)
41
Sinteza logică a registrului paralel paralel cu încărcare şi deplasare
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
43
Regiştrii paralel-serie, respectiv serie-paralel
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
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
reg [N-1:0] tmp; // semnal intern; are rolul de a stoca data pe N biti
funcţia de deplasare a
datelor este implementată
prin intermediul unei reţele
de multiplexoare, rezultatul
fiind apoi aplicat unui
registru paralel paralel
8 bistabile D
intrare date d
N
q iesire date
intrare initializare rst
intrare ceas clk
rsp
reg [N-1:0] tmp; // semnal intern; are rolul de a stoca data pe N biti
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
reg [N-1:0] tmp; // semnal intern; are rolul de a stoca data pe N biti
53
Implementarea FPGA a registrului serie serie
54
Modelarea blocurilor de
memorie
55
Memoria ROM asincronă
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
module romA #(
parameter N = 3, // dimensiunea magistralei de adresă;
parameter W = 8) // dimensiunea cuvintului de memorie
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”
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
initial
$readmemb (“fisier_initializare_memorie”, mem);
assign dout = mem[addr]; // modelarea operatiei de citire asincrona
endmodule
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
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)
endmodule
61
Sinteza logică şi implementarea memoriei ROM sincrone
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ă
63
Modelarea comportamentală a memoriei RAM cu citire
asincronă şi citire sincronă
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”.
detaliu
65
Memoria RAM cu scriere sincronă şi citire sincronă
N
intrare adresa addr
ramS
66
Modelarea comportamentală a memoriei ROM cu citire
asincronă şi citire sincronă
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);
`timescale 1ns/100ps
module c03TCOCorect (input clk, d, output reg q);
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;
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;
76
Inserarea a 2 semnalelor de
inţializare
architecture beh of dff_rpasinc is
begin
process (clk, reset, preset)
begin
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
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;
83
Generarea accidentală a
registrelor
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
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
end RAM_SP; 89
1. Memorie RAM single port cu citire asincronă -
arhitectura
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
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ă
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
96