Multipleksery, Rejestry i pamięci

Download Report

Transcript Multipleksery, Rejestry i pamięci

Rejestry przesuwne,
Pamięci
Ernest Jamro
Kat. Elektroniki AGH
Multiplekser
In0
0
Out
In1
1
In0 when Sel  0
Out  
In1 when Sel  1
Mux 2:1
Sel
In0
In1
In2
In3
Sel
0
1
2
3
Out
 In0
 In1

Out  
 In 2
 In3
when Sel  0
when Sel  1
when Sel  2
when Sel  3
Mux 4:1
Multiplekser 2:1 na bramkach
In0
0
Out
In1
Sel\In1, In0
00
01
11
10
0
0
1
1
0
1
0
0
1
1
1
Out= SelIn0 + Sel In1
Sel
In0
Out
In1
Sel
Multiplekser na bramkach – postać ogólna
In0
In1
Out
Inn
Sel
Mux 4:1
In0
In0
In1
Out
In1
Out
In2
Inn
Sel
In3
Dekoder kodu
binarnego na 1 z n
Sel1
Sel0
Multiplekser na buforach trójstanowych
In0
In1
VHDL (testbench):
Ch(1)<= In1 when Tn(1)=‘1’ else ‘Z’;
Y<= ch(1);
Ch(2)<= In2 when Tn(2)=‘1’ else ‘Z’;
Y<= ch(2);
Y
 In when T  1
Out  
 HiZ when T  0
Inn
In
Sel
VHDL (wewnątrz FPGA):
Dekoder kodu
binarnego na 1 z n
In0
Out
T
In1
Sel0
Sel1
Aby uniknąć krótkotrwałego zwierania
buforów stosuje się krótki czas martwy w
którym wszystkie bufory są w stanie
wysokiej impedancji. Wymaga to użycia
automatu zamiast prostego dekodera kodu
binarnego na 1 z n.
Out
Możliwa równoczesny stan niskiej impedancji
dla dwóch buforów trójstanowych wynikający z
czasów propagacji
Multiplekser na bramkach OC
*.ucf
NET "ch<1>" LOC = "T3" ;
NET "ch<1>" PULLUP;
VHDL bramka OD/OC:
Ch(1) <= ‘0’ when D0=‘0’ else ‘Z’;
Ch(2)<= ‘0’ when D1=‘0’ else ‘Z’;
Y= S’D0 + SD1
- multiplekser
A + B= (A’B’)’ - prawo De Morgana, (Wired AND)
Y= ( (S’D0)’ (SD1)’ )’
Demultiplekser
Out0
Out1
In
Outn
Sel
In
Out0
In
Out0
Out1
Out1
Out2
Outn
Sel
Dekoder kodu
binarnego na 1 z n
Out3
Sel1
Sel0
Multipleksowanie w czasie
4
In0
In1
In2
In3
7
4
Licznik mod 4
Transkoder
BCD na kod
7segmentowy
Wyświetlacz
7-segmentowy
Dekoder z
kodu
binarego na
1z4
Tylko jeden wyświetlacz jest aktywny
w danej krótkiej chwili czasowej
W układach scalonych z reguły bardziej kosztowne jest dodanie
dodatkowego wyprowadzenia niż dodatkowej logiki
SIPO (Serial-In Parallel-Out)
Din
Q0
D
C
Q
Q1
D
Q
C
Q2
D
Q
C
Clk
process(clk) begin
if clk'event and clk1=‘1' then
Q(N-1 downto 0)<= Q(N-2 downto 0) & Din;
end if;
end process;
SIPO (Clock Enable) – błędne użycie
Din
Q0
D
Q
Q1
D
C
Q
Q2
D
C
Q
C
Clk2
D
QC
Q
Przykład taktowania co drugi takt zegara
modułu SIPO i złego użycia bramki AND
na sygnale zegarowym – powstaje
wyścig!!!
C
Clk
Clk
QC
Clk2
0
1
2
3
4
5
SIPO (Clock Enable) – poprawne użycie
Q0
Din
D
Q1
Q
D
C
Q
Q2
D
C
Q
C
Clk2
D
Clk
Q
QC
Przykład taktowania co drugi takt zegara SIPO
– sygnał zegarowy jest wyjściem Q
przerzutnika (Uwaga wyścig może powstać
pomiędzy sygnałem Din a Clk2).
C
Clk
QC/Clk2
0
1
2
3
4
5
SIPO (CE - Clock Enable)
SISO (Serial-In Serial-Out)
Parallel-In Serial-Out (PISO)
Din
D0
0
1
D
Clk
Q
Q0
1
2
3
4
5
Q0
D0(t=0)
Din(t=1)
Din(t=2)
Din(t=3)
Din(t=4)
D0(t=5)
Q1
D1(t=0)
D0(t=0)
Din(t=1)
Din(t=2)
Din(t=3)
D1(t=5)
Q2
D2(t=0)
D1(t=0)
D0(t=0)
Din(t=1)
Din(t=2)
D2(t=5)
Q3
D3(t=0)
D2(t=0)
D1(t=0)
D0(t=0)
Din(t=1)
D3(t=5)
Clk
0
Load
Clk
Din
D1
0
1
D
Clk
Q
Q1
D0/Din
D1
Clk
D2
D2
0
1
D
Clk
D3
Load
0
1
Q2
Clk
D
Clk
Q
Clk
Q
D3
Q3/Qout
PISO - VHDL
Din
D0
0
1
D
Clk
Q
Q0
process(clk) begin
if clk'event and clk1=‘1' then
Clk
if load=‘1’ then
D1
0
1
D
Clk
Q
Q1
Q <= D;
else
Clk
Q(N-1 downto 0)<= Q(N-2 downto 0) & Din;
D2
0
1
D
Clk
D3
Load
Q
Q2
end if;
end if;
Clk
end process;
0
1
D
Clk
Clk
Q
Q3/Qout
Qout<= Q(N-1);
Przesyłanie danych szeregowo
Sposób 1
SIPO
PISO
Clk
takt
In0
In1
Sposób 2
D
clk
Mux
Dserial
Inn
Out0
Out1
D
Mux
Rejestr
Outn
Sel
Sel
Licznik
modulo n
Licznik
modulo n
Clk
In0
In1
Mux
D
CE
Dserial
D
CE
Inn
D
CE
Sel
mod n
counter
Clk
mod n
one hot counter
Incrementator (S=A+1)
a3
a2
HA
Half Adder
s4
c3
s3
HA
Half Adder
s2
a1
c2
a0
HA
Half Adder
c0
HA
Half Adder
s1
Si
1
s0
Ci
ci-1\ai
0
1
ci-1\ai
0
1
0
0
1
0
0
0
1
1
0
1
0
1
si = ai  ci-1
ci= ai ci-1
HA
Half Adder
Incrementator: Example
a3
a2
1
HA
Half Adder
0
s4
0
c3
HA
Half Adder
1
1
c2
FA
Full Adder
1
s2
a0
1
0
1
s3
a1
1
c0
HA
Half Adder
0
s1
A=10112= 1110=0xB
S=A+1= 11002=1210=0xC
0
s0
1
Dodawanie z szeregową propagacją przeniesienia
(Ripple Carry) Adder: S= A+B
a3
b3
FA
Full Adder
a2
c2
s3
b2
FA
Full Adder
s2
si
a1
c1
b1
FA
Half Adder
a0
c0
b0
HA
Half Adder
s1
s0
ai + bi+ci-1 = si + 2·ci
ci-1\ai,bi
00
01
11
10
0
0
1
0
1
1
1
0
1
0
si = ai  bi  ci-1
ci= ai bi + ai ci-1 + bi ci-1= ai bi + ci-1 (ai  bi)
ci
ci-1\ai,bi
00
01
11
10
0
0
0
1
0
1
0
1
1
1
ci 1 if ai  bi  1
ci  
ai if ai  bi  0
Propagate
Generate
Odejmowanie / Subtraction (a-b)
Two’s Complement (2C)
Direct
N 1
 b  2  bN   2i  bi  b 1
ai - bi-ci-1 = si - 2·ci
N
i 0
si = ai  bi  ci-1
Sign bit
negation
ci  ai bi  ci 1 ai  ci 1bi
si
ci-1\ai,bi
00
01
11
10
0
0
1
0
1
1
1
0
1
0
00
01
11
10
0
0
1
0
0
1
1
1
1
0
Red color – difference between addition and subtraction
LSB
(Least
Significant Bit)
Instead of employing dedicated
subtraction we can use a standard
adder convert B to 2C code
ci
ci-1\ai,bi
Add 1 to the
Example: 1111 in 2C=
0000+1= 0001 (minus one)
Add/Subtract Logic
S<= A+B when Sub=‘0’ else
A-B;
 A  B when Sub  0
S 
 A  B when Sub  1
Convert B to Two’s Complement when Sub=1
a3
b3
b2
a2
a1
b1
a0
b0
Sub
 A when Sel  0
Y  A xor Sel  
 A when Sel  1
FA
Full Adder
s3
c2
FA
Full Adder
s2
c1
FA
Full Adder
s1
c0
FA
Full Adder
s0
Dodaj,Odejmij, Przepełnienie, Przykłady
Add: 9+1= 10
Add: 9+8= 17
0 1 0 0 0
01001 = 9
Add: -9+8= -1
0 0 0 0 0
01001 = 9
10111 = -9
00001 = 1
01000 = 8
01000 = 8
01010 = 10
10001 = -15
11111 = -1
Overflow
Overflow= CarryOutN xor CarryOutN-1
Subtract: 9-1= 8
Subtract: 9-8= 1
1 1 0 0 0
Subtract: -9-8= -17
1 0 0 0 0
01001 = 9
01001 = 9
10111 = -9
11111 = -1
11000 = -8
11000 = -8
01000 = 8
00001 = 1
01111= 15
Overflow
Counter mod
N
2
Increamentator
HA
Half Adder
HA
Half Adder
HA
Half Adder
HA
Half Adder
1
Qn+1= Qn+1
D
Q
Q3
C
D
Q
Q2
C
D
Q
Q1
C
D
Q
Q0
C
Clk
architecture Beh of counter_2N is
Registers
signal Q: std_logic_vector(3 downto 0);
library IEEE;
begin
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
process(clk, reset_asynch) begin
if reset_asynch=‘1’ then
Q<= (others=>’0’);
entity counter_2N is
port(clk, reset_asynch: in std_logic;
count : out std_logic_vector (3 downto 0));
end counter_2N;
architecture Behavioral of race_ce is
signal p: std_logic_vector(4 downto 0);
elsif clk’event and clk=‘1’ then
Q<= Q + 1;
end if;
end process;
Count<= Q
end Beh;
Counter mod N
=N-1
+1
0 when Q  N  1 or reset _ synch  1
D
Q  1 when Q  N  1
architecture Beh of counter_N is
signal Q: std_logic_vector(3 downto 0);
begin
D Q
Reset
C
Clk
process(clk) begin
if clk’event and clk=‘1’ then
if reset_synch=‘1’ or Q=N-1 then
Q<= (others=>’0’);
else
Q<= Q + 1;
end if; -- not reset
end if; -- clk
end process;
end Beh;
Up/Down Counter mod
Up/DownN
N
2
Q  1 when Up  0
D
Q  1 when Up  1
+/-1
architecture Beh of counter_up_down is
D
Q
signal Q: std_logic_vector(3 downto 0);
begin
C
Clk
process(clk) begin
if clk’event and clk=‘1’ then
if Up_DownN=‘1’ then
Q<= Q + 1;
else
Q<= Q - 1;
end if; -- up / downN
end if; -- clk
end process;
Count <= Q;
end Beh;
Up/Down Counter mod N
Comp
=N-1
or =0
process(clk) begin
if clk’event and clk=‘1’ then
if Up_DownN=‘1’ then
if Q = N-1 then
U/DN
Q<= (others=>’0’)
+/-1
else
Q<= Q + 1;
N-1
D
0
Q
Load
C
Clk
0 when Q  N  1 and Up  1
 N  1 when Q  0 and Up  0

D
Q  1 when Q  N  1 and Up  1
Q  1 when Q  0 and Up  0
end if;
else -- counting down
if Q = 0 then
Q<= conv_std_logic_vector(N-1, vec_width);
else
Q<= Q - 1;
end if;
end if; -- up / downN
end if; -- clk
end process;
Rotacja, Przesunięcie logiczne i
Arytmetyczne
Wejście: a3a2a1a0
W lewo
Rot: a2a1a0a3
B<= A(2 downto 0) & A(3);
Log: a2a1a00
B<= A(2 downto 0) & ‘0’;
Arith: a2a1a00
B<= A(2 downto 0) & ‘0’;
W prawo
Rot: a0a3a2a1
B<= A(0) & A(3 downto 1);
Log: 0a3a2a1
B<= ‘0’ & A(3 downto 1);
Arith: a3a3a2a1
B<= A(3) & A(3 downto 1);
Logiczne –mnożenie/dzielenie przez 2 dla nieujemnych liczb
Arytmetyczne: mnożenie/dzielenie przez 2 dla uzupełnień do dwóch
Przykład: –1= 1111; -1/2= 1111= -1
Rejestr przesuwny w prawo lub lewo
DLEFT
SLEFT 0
DRIGHT
1
D
0
Q
0
1
0
D
Clk Clk
Clk
1
2
1
Q
0
D
1
Q
D
Clk Clk
Clk Clk
Clk Clk
Q3/QLEFT
Q2
Q1
3
4
5
SLEFT=1 – przesuń w lewo
DLEFT
DRIGHT
Q2
Q1
Q0/QRIGHT
Q0/QRIGHT
SLEFT=0 – przesuń w prawo
SLEFT
Q3/QLEFT
Q
DL(t=0)
DL(t=1)
DL(t=2)
DL(t=3)
DL(t=2)
DL(t=1)
DL(t=0)
DL(t=1)
DL(t=2)
DL(t=1)
DL(t=0)
DL(t=0)
DL(t=1)
DL(t=0)
DR(t=4)
DL(t=0)
DR(t=4)
DR(t=5)
Rejestr przesuwny w prawo i w lewo z wpisem równoległym
D3
D2
D1
D0
DLEFT
S
DRIGHT
0 1 23
D
Clk Clk
0 1 23
Q
D
0 1 23
Q
D
0 1 23
Q
D
Clk Clk
Clk Clk
Clk Clk
Q3/QLEFT
Q2
Q1
process(clk) begin
if clk’event and clk=‘1’ then
if S(1)= ‘1’ then -- load
S= 0
- przesuń w prawo
S=1
- przesuń w lewo
S=2
- wpis równoległy
S=3
- wpis równoległy
Q<= D;
elsif S(0)= ‘0’ then – shift right
Q<= Dleft & Q(3 downto 1);
else -- shift left
Q<= Q(2 downto 0) & Drigth;
end if; end if; end process;
Q
Q0/QRIGHT
Rejestr przesuwny: rotujący, logiczny, arytmetyczny
ROTACJA
D3
S
D2
0 1 23
D
0 1 23
Q
Clk Clk
LOGICZNY
D3
S
0 1 23
D
D
Q
0 1 23
D
0 1 23
Q
D
Clk Clk
Clk Clk
Clk Clk
Q3/QLEFT
D2
Q2
Q1
Q
ARYTMETYCZNY
D3
D0
0 1 23
D
D0
0 1 23
Q
D
0 1 23
Q
D
Clk Clk
Clk Clk
Clk Clk
Q3/QLEFT
D2
Q2
Q1
D1
0 1 23
Q
Q0/QRIGHT
D1
0 1 23
Clk Clk
S
D1
Q
Q0/QRIGHT
D0
0 1 23
0 1 23
Mnożenie/dzielenie przez 2
D
Clk Clk
Q
D
Q
D
Q
D
Clk Clk
Clk Clk
Clk Clk
Q3/QLEFT
Q2
Q1
Q
Q0/QRIGHT
Kopiowanie bity znaku przy
dzieleniu w kodzie U2
Barrel Shifter (szybkie przesunięcie o dowolną liczbę bitów)
Mnożenie
Dzielenie
(kod U2 - uzupełnień
do dwóch)
Barrel Shifter - wielopoziomowy
In3
In2
In1
In0
przesuń
0 lub 1-bit
Sel0
przesuń
0 lub 2-bity
Sel1
Out3
Out2
Out1
Out0
Każdy z n poziomów przesuwa o 0 lub 2i-bitów (i=0..(n-1)) bitów
w ten sposób można przesunąć o dowolną liczbę bitów w zakresie
od (0..2n-1)-bitów używając prostych multiplekserów 2:1.
Pamięci - klasyfikacja
•
ROM (Read Only Memory) - nieulotne (non-volatile)
–
–
–
–
–
•
•
ROM (programowany podczas produkcji układu scalonego)
PROM (programowane jednorazowo u użytkownika)
EPROM (Erasable PROM – możliwa ale uciążliwa wielokrotna
programowalność
EEPROM (Electrically Erasable and Programmable ROM)
Flash (błysk-awiczne EEPROM)
RAM (Random Access Memory), Ulotne
Pamięci specjalizowane
Pamięci ROM
Pamięci ROM powstają bezpośrednio w procesie produkcji układu
scalonego dlatego mają następujące cechy:
•Stan pamięci określony na poziomie produkcji układu scalonego
•Brak możliwości zmiany zawartości pamięci
•Tanie w produkcji ale wymagają dużych nakładów (wykonania w
milionach sztuk – drogie przy małej liczbie sztuk)
•Długi okres produkcji – kilkanaście tygodni.
•Pamięci coraz rzadziej stosowane
Schemat pojedynczej komórki ROM
VDD
Wejście
adresowe
A0
A1
Dekoder
k-bitowego
kodu
dwójkowego
na „1 z 2k”
Stan ‘1’ – brak
bramki lub
całego
tranzystora
Stan ‘0’ – jest
bramka
Wyjście
Ak-1
Wybieranie 2 wymiarowe
Sposób
wybierania np.
klawiszy,
komórek
pamięci, itd
Dekoder
binar
na
1zn
SelY
Mux
SelX
Dwuwymiarowe wybieranie komórki pamięci
VDD
VDD
Dekoder
k-bitowego
kodu
dwójkowego
na „1 z 2k”
A0
A1
Wiersz
Ak-1
Ak
Ak+1
An-1
Multiplekser: 1 z 2n-k
adresowany (n-k)-bitowowo
Kolumna
Wyjście
VDD
Pamięci PROM
Programmable Read Only Memory:
Programowanie pamięci wykonywane jest przez użytkownika w
specjalnym urządzeniu programującym.
Programowanie następuje poprzez przepalenie tzw.
bezpieczników (ang. fuse) i jest nieodwracalne.
Pamięci te są dzisiaj rzadko stosowane
Pamięci EPROM
Erasable Programmable ROM
Kasowanie pamięci wymaga użycie promieni UV i specjalnego
okienka kwarcowego – co zdecydowanie podraża koszt
produkcji. Czas kasowania to około 30min.
Pamięci dzisiaj raczej nie stosowane
Tranzystor
w EPROM
Swobodna bramka
(floating gate)
Pamięci EEPROM
Electrically Erasable Programmable Read-Only
Możliwość elektrycznego wielokrotnego kasowania pamięci.
Łatwość kasowania, nie potrzeba użycia promieni UV
Kasowanie całej pamięci lub pojedynczego sektora
Liczba kasowań około 10 000 - 100 000 razy
Programowanie i kasowanie
EEPROM
Pamięć EEPROM Flash
Struktura działania podobna do EEPROM.
Bardzo szybki proces kasowania (rzędu 1ms) w porównaniu z
pamięcią EEPROM (rzędu 15min.).
Szybkość pracy pamięci Flash polega głównie na kasowaniu
całego bloku na raz a nie jak to ma miejsce w pamięci EEPROM
pojedynczych bajtów.
Potrzebny tylko 1 tranzystor na 1 bit pamięci
Flash – kasowanie i
programowanie
Struktura NOR i NAND pamięci
Flash
a) Struktura NOR
b) NAND
Flash: NOR i NAND
W strukturze NAND napięcia wszystkich (oprócz jednej) bramek WL0-WL15 są na tyle
wysokie że tranzystory szeregowe zawsze przewodzą. Natomiast napięcie jednej bramki
jest takie, że stan pracy tranzystora zależy od zaprogramowania.
Cechy struktury NOR:
•Swobodny odczyt, ale wolny zapis i kasowanie
•Preferowane jako pamięci o dostępie swobodnym (BIOS, ROM procesora)
Cechy struktury NAND
•Preferowany odczyt całego bloku danych
•Tańsze w produkcji od NOR (zajmują mniej powierzchni krzemu)
•Szybszy zapis i kasowanie
•Liczba kasowań około 10 razy większa niż w przypadku NOR
•Preferowany dla pamięci masowych (pendrive, karty CF/SD, SSD- Solid State Drive)
Wielopoziomowe pamięci Flash
Multiple Level Cell (MLC)
Alternatywa:
Single Level Cell (SLC)
Pamięci Flash i Interface szeregowy:
•I2C (Inter Integrated Circuit) – 2 przewody (100, 400kHz,
3.4MHz) (Philips)
•SPI (Serial Peripherial Interface) – 3 przewody (1-50MHz)
(Motorola)
•Microwire – 3 przewody (1-3MHz) (National Semiconductor)
Przykład pamięci ROM w VHDL
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
architecture syn of rom is
type rom_type is array (63 downto 0) of std_logic_vector (19 downto 0);
signal ROM : rom_type:=
(X"0200A", X"00300", X"08101", X"04000", X"08601", X"0233A",
entity rom is
X"00300", X"08602", X"02310", X"0203B", X"08300", X"04002",
port ( ADDR : in std_logic_vector(5 downto 0);
X"08201", X"00500", X"04001", X"02500", X"00340", X"00241",
DATA : out std_logic_vector(19 downto 0));
X"04002", X"08300", X"08201", X"00500", X"08101", X"00602",
end rom;
X"04003", X"0241E", X"00301", X"00102", X"02122", X"02021",
X"00301", X"00102", X"02222", X"04001", X"00342", X"0232B",
X"00900", X"00302", X"00102", X"04002", X"00900", X"08201",
X"02023", X"00303", X"02433", X"00301", X"04004", X"00301",
X"00102", X"02137", X"02036", X"00301", X"00102", X"02237",
X"04004", X"00304", X"04040", X"02500", X"02500", X"02500",
X"0030D", X"02341", X"08201", X"0400D");
begin
data <= ROM(conv_integer(ADDR));
end syn;
Pamięci
•ROM (Read Only Memory)
•RAM (Random Access Memory)
Statyczne (SRAM)
-Asynchroniczne
-Synchroniczne
Dynamiczne (DRAM)
-Asynchroniczne (historia)
- Synchroniczne SDRAM, DDR, DDR2, DDR3, RAM-BUS (RDRAM), XDR-DRAM
Specjalizowane
FIFO (First-In First-Out)
LIFO (Last-In First-Out – stos)
CAM (Content-Addressable Memory)
LUT (Look-Up Table) (pamięć ROM/RAM)
Podstawowa komórka pamięci
SRAM
Linia wiersza
U’DD
T5
T6
T3
T4
Linia
kolumny
(bit B)
T1
T2
Przerzutnik RS
Przerzutnik bistabilny
– dwa inwertery
Linia
kolumny
(bit B)
Przerzutnik RS –
przejście w inny stan
poprzez zwarcie
Alternatywna (już nie stosowana)
postać komórki SRAM
Linia wiersza
U’DD
RD
RD
T3
T4
Linia
kolumny
(bit B)
Linia
kolumny
(bit B)
T1
T2
Synchroniczny zapis, asynchroniczny odczyt
CE
Q
D
D
C
CE
Q
A0
A1
A0
D0
D
A1
D1
C
MULTIPLEKSER
P0
P1
DEKODER
2 na 4
P2
D2
WE
E
n
a
D3
P0
CE
Q
D
C
CE
D
C
C
Q
0
S0 S1
Dwukierunkowa transmisja
danych po jednym przewodzie
Schemat Blokowy układ: AS7C4096
512k×8bit
Tablica prawdy
Przykładowe przebiegi
Parametry czasowe pamięci
Przykładowe przebiegi (zapis)
Przykład zapisu i odczytu pamięci
Address
A1
A2
A1
A2
A1
Write Enable
D1
Data
DataIn
DataOut
nieznany
(stan
poprzedni)
D1
D2
D1
D2
D3
D2
D3
D2
D3
D3
D1
D3
czas dostępu
Wysoka
(Address do
impedancja
ważnych Data)
Zerowanie pamięci
Brak resetu umożliwiającego zerowanie całej pamięci –
konieczne jest zerowanie wszystkich komórek po kolei
„0”
DIN
Licznik
n –bitowy
wejście
taktujące
Clk
A[n:0]
RAM 2nx1
WE
O
Łączenie Pamięci,
pamięć duża 128x1 z 4 pamięci 32x1
Użycie multipleksera
A[4:0]
A[6:0]
Bloki pamięci
RAM32x1
D
O
WE
A[6:5]
dekoder
2-na-4
A0:A4
D0
D
O
D1
WE
Multiplekser
A0:A4
O
D
O
WE
D2
D3
A0:A4
S[1:0]
D
WE
E
WE
D
A0:A4
O
Łączenie pamięci
CEN
CEN
OEN
WEN
OEN
WEN
A
SRAM0
A
D7-0
D7-0
D15-0
CEN
OEN
WEN
SRAM1
A
D7-0
D15-8
CEN
Zwiększenie szerokości
magistrali danych
(preferowane)
A0
CEN
OEN
WEN
OEN
WEN
A15-1
SRAM0
ADR
D7-0
D7-0
A0
CEN
OEN
WEN
SRAM1
ADR
D7-0
Zwiększenie szerokości
magistrali adresowej
Pamięci synchroniczne SRAM - odczyt
tCHCH
tCH
tCL
CLK
tAVCH
A0 – A16
tCEVCH
tCHAX
Adres n
Adres n + 1
Adres n + 2
tCHQV
tCHQZ
tCHCEX
CE
tOEVCH
tOHCEX
tWEVCH
tCHWEX
OE
WE
Dane
wyjściowe
Hi - Z
Dane z komórki
o adresie n+1
Dane z komórki
o adresie n
tCHQX2
tCHQX1
Synchroniczny zapis, asynchroniczny odczyt
CE
Q
D
D
C
CE
Q
A0
A1
A0
D0
D
A1
D1
C
MULTIPLEKSER
P0
P1
DEKODER
2 na 4
P2
D2
WE
E
n
a
D3
P0
CE
Q
D
C
CE
D
C
C
Q
0
S0 S1
Synch. zapis / asynch. odczyt - VHDL
process (<clock>)
begin
if (<clock>'event and <clock> = '1') then
if (<write_enable> = '1') then
<ram_name>(conv_integer(<address>)) <= <input_data>;
end if;
end if;
end process;
<ram_output> <= <ram_name>(conv_integer(<address>));
Pamięci synchroniczne SRAM - zapis
tCHCH
tCH
tCL
CLK
tAVCH
A0 – A16
tCHAX
Adres n
tCEVCH
Adres n + 1
tCHCEX
CE
tWEVCH
tCHWEX
WE
tDVCH
Dane
tCHDX
Dn
Dn + 1
Adres n + 2
SSRAM - Zapis i odczyt jedna
magistrala danych
0
Clk
Adr
AWr0
1
AWr1
2
ARd0
3
4
5
AWr2
ARd1
WE
Write Enable
OE
Output Enable
Data
DWr0
DWr1
HiZ
DRd0
DRd1
HiZ
Zmiana
Zmiana
kierunku
kierunku
DWr2
Niezależne magistrale danych do zapisu i odczytu
Read before Write lub Write Before Read
Clk
Adr
0
1
2
3
4
5
A0
A0
A0
A2
A0
A2
D0
D0
D1
D2
Write
DataWr
DataRd
D?
D0
D0
D?
D1
D2
D0
D0
D1
D2
D1
D2
Read before Write
DataRd
Write before Read
SSRAM,
opóźnienie - 1 clk
Pamięć - VHDL
library ieee;
architecture syn of rams_01 is
use ieee.std_logic_1164.all;
type ram_type is array (1023 downto 0) of std_logic_vector (15 downto 0);
use ieee.std_logic_unsigned.all;
signal RAM: ram_type;
signal ADDR_Q: std_logic_vector(9 downto 0); -- write before read
entity rams_01 is
begin
port (CLK : in std_logic;
WE : in std_logic;
process (CLK)
ADDR : in std_logic_vector(9 downto 0);
begin
DI : in std_logic_vector(15 downto 0);
if CLK'event and CLK = '1' then
if WE = '1' then
DO : out std_logic_vector(15 downto 0));
RAM(conv_integer(ADDR)) <= DI;
end rams_01;
end if;
DO <= RAM(conv_integer(ADDR)) ; -- read before write
ADDR_Q<= ADDR; -- write before read
end if;
end process;
DO <= RAM(conv_integer(ADDR_Q)) ; -- write before read
end syn;
Synchroniczny zapis, asynchroniczny odczyt
CE
Q
D
D
C
CE
Q
A0
A1
A0
D0
D
A1
D1
C
MULTIPLEKSER
P0
P1
DEKODER
2 na 4
P2
D2
WE
E
n
a
D3
P0
CE
Q
D
C
CE
D
C
C
Q
0
S0 S1
Synchroniczny zapis, asynchroniczny odczyt
Clk
Adr
0
1
2
A0
3
4
5
A2
A0
A2
Write
DataWr
DataRd
D1
D0
D1
D2
D0
DA2 D2
D0
D2
Pamięci wieloportowe
Port A
Pamięć
Dwuportowa
Port B
Dwa takie same niezależne interface’y do pamięci – ale ta sama
pamięć!
Pamięć quasi dwuportowa?
Jeden port do zapisu synchronicznego,
dwa porty do odczytu asynchronicznego
CE
Q
D
D
C
P0
P1
S0
S1
SP0
P2
CE
Q
P0
MULTIPLEKSER
A0
A1
A0
D0
D
A1
D1
C
DEKODER
2 na 4
D2
E
D3
CE
Q
D
WE
MULTIPLEKSER
C
P0
P1
P2
CE
D
C
C
DPRA0
DPRA1
Q
P0
DP0
S0 S1
1 port zapis, 2 porty odczyt - VHDL
process (<clock>)
begin
if (<clock>'event and <clock> = '1') then
if (<write_enable> = '1') then
<ram_name>(conv_integer(<address1>)) <= <input_data>;
end if;
end if;
end process;
<ram_output1> <= <ram_name>(conv_integer(<address1>));
<ram_output2> <= <ram_name>(conv_integer(<address2>));
Konflikty w pamięci dwuportowej
Zapis na dwóch portach pod ten sam adres – konflikt (stan nieokreślony) – Adr= A2
Clk
AdrA
0
1
2
3
4
A0
A2
A1
A2
A0
DWr0
DWr2A
DRd0
DRd2
DWr1
A1
A2
A0
A2
DWr1
DWr2B
DRd2
DWr0
5
WriteA
DataWrA
DataRdA
AdrB
DWr0
A0
WriteB
DataWrB
DataRdB
DRd1
DWr0
Komórka pamięci wieloportowej
Pamięć jednoportowa
dwuportowa
czteroportowa
Optymalizacja komórki pamięci
dwuportowej
Literatura: Area-Efficient Dual-Port Memory Architecture for Multi-Core
Processors - Hassan Bajwa and Xinghao Chen
Dynamic RAM
Pierwsze
tranzystorykondensatory
Dzisiejsze kondensatory są
budowane w 3 wymiarach
aby zmniejszyć rozmiar
powierzchni i zwiększyć
pojemność C
Pamięci dynamiczne DRAM
Ф1
Linia wiersza
W
Ф2
CB
T
Ф3
CS
Odczyt 1
UM
B
UB
Ф1
Linia
kolumny
(bitu)
US1
UB1
UB0
Odczyt 0
T1
1
I1
I2
T2
Ф3
UM
US
0
US0
Odczyt pamięci DRAM
tRC
tRCD
RAS
CAS
Stan nieistotny
Adres
R
C
WE
H
tRAC
Q
Hi - Z
RAS – Raw Address Strobe
CAS – Column Address Strobe
Hi - Z
Zapis pamięci DRAM
RAS
CAS
Adres
WE
D
R
C
Odświeżanie
•Odświeża się cały wiersz podczas pojedynczego odczytu
RAS
CAS
Adres
R
•CAS before RAS
Jeśli /CAS jest ustawiany w stan niski (aktywny) prezzd
sygnałem /RAS to pamięć DRAM ignoruje adres podany na
magistrali adresowej i używa swojego wewnętrznego licznika
odświeżeń aby odświeżyć kolejny wiersz
Fast Page Mode
RAS
CAS
Adres
Q
R
Hi - Z
C
C
C
Pamięć SDRAM Synchronouse DRAM (Single Data Rate)
tCAS
Parametry czasowe
tCAS-tRCD-tRP-tRAS
przykład: 2.5-3-3-8
CL = CAS Latency time: The time it takes between a command having been sent to the memory and when it begins to reply to it. It
is the time it takes between the processor asking for some data from the memory and it returning it.
TRCD = DRAM RAS# to CAS# Delay: The number of clock cycles performed between activating the Row Access Strobe and the
Column Access Strobe. This parameter relates to the time it takes to access stored data.
TRP = DRAM RAS# Precharge: The amount of time between the 'precharge' command and the 'active' command. The precharge
command closes memory that was accessed and the active command signifies that a new read/write cycle can begin.
TRAS = Active to Precharge delay: The total time that will elapse between an active state and precharge state. This is the sum of the
previous timings: CL + TRCD + TRP
SDRAM
SDRAM
– różne
banki
DDR SDRAM- Double Date Rate
•Transfer danych następuje 2 razy na takt zegara – na narastające i
opadające zbocze
•Komendy akceptowane są co takt zegara (w pierwszym
przybliżeniu) i są podobne jak dla sdram
•Obniżono napięcie zasilania z 3.3V (sdr sdram) na 2.5V (DDR)
•Szybkość transmisji: 2(ddr) * 8 (bajtów) *f
DDR2
•Transfer danych na narastającym i opadającym zboczu (błędem jest twierdzenie że 4 razy na
takt zegara)
•Częstotliwość wewnętrzna pamięci 2 razy mniejsza od częstotliwości magistrali zewnętrznej
– dlatego podczas jednego odczytu z pamięci wewnętrznej odczytywane są 4 bity, które są
kolejno transferowane pojedynczo
•Obniżone napięci zasilania na 1.8V
•Aby osiągnąć wyższą wydajność od pamięci DDR pamięci DDR2 są taktowane wyższą
częstotliwością
•Pamięci te mają większe opóźnienie (latency), np. Dla DDR typowe to 2 do 3, dla DDR2
typowe to 4 do 6 taktów zegara – opóźnienie to jest częściowo rekompensowane większą
częstotliwością taktowania
DDR3
•Częstotliwość wewnętrzna pamięci 4 razy mniejsza od częstotliwości zewnętrznej
– dlatego podczas jednego odczytu wewnętrznego czytanych jest 8 bitów, które z
kolei są transmitowane pojedynczo w 4 taktach zegara
•Zwiększono częstotliwość taktowania
•Zwiększono opóźnienie (latency)
•Zmniejszono napięcie zasilania do 1.5V
Dual-Channel Memory
Zwiększona szerokość magistrali danych z 64-bitów do 128-bitów
First-In First-Out (FIFO)
Wejście: A, B, - ,C, - , D, E
Wyjście: - , A, - , B, - , - , C, - , D , E
empty
Licznik wejściowy
full
adrA
We
In
Wy
Pamięć dwuportowa
DaneA
Shift
register
LUT
SRL
DaneB
Mux
adrB
Licznik wyjściowy
D
clk
Q
Up/Down Counter
Out
Last-In First-Out (LIFO)
(stos)
Wejście: A, B, - ,C, - , D, E
Wyjście: - , B, - , C, - , - , E, - , D , A
Licznik Rewersyjny
We
Pamięć
Wy
We
Wy
Zapis
Odczyt
Licznik (Qn+1)
0
0
Qn
1
0
Qn +1
0
1
Qn -1
1
1
Qn
Rejestr
przesuwny
w prawo i
lewo
Bufor opóźniający na rejestrze
przesuwnym
We
Rejestr
przesuwny
w prawo
SRL
Mux
Opóźnienie
Wy
Bufor opóźniający na pamięci
Licznik mod 2n
Opóźnienie
Sumator
AdrA
We
DAWr
AdrB
Pamięć dwuportowa
DBRd Wy
Content-addressable memory
(CAM)
Podajemy wartość danej a pamięć CAM zwraca adres (lub
adresy) pod którymi znajduje się podane dana
W konsekwencji należy przeszukać całą pamięć aby otrzymać
adres pod którym znajduje się podana dana
Przykład pamięci:
Adres: 0
1
2
3
4
5
6
7
Dana: 5
4
3
2
1
0
3
3
Dana: 4, wynik: 1;
Dana 3, wynik: 2, (6, 7)
Look-Up Table (LUT)
Adres
Kwadrat:
Adres: 0, 1, 2, 3, 4...
Dana: 0, 1, 4, 9, 16...
LUT
Dana
wyjściowa
Obliczanie histogramu
DataIn
Adr
Din
BRAM
Dout
+1
Zadania lab na 3.0
1. Zaprojektować układ zapełniający po kolei wszystkie komórki pamięci kolejnymi wartościami
używając a) pamięci RAM16x?S, b) RAMB16_?S
2. Z pamięci o szerokości danych N-bitowej skonstruować pamięć o większej szerokości
magistrali danych 2N-bitowej, 4N-bitowej (uŜywając pamięci a) RAM16x?S, b)
RAMB16_S?).
3. Z pamięci o mniejszej pojemności zaprojektuj pamięci o a) 2, b) 4 razy większej pojemności,
przy tej samej szerokości magistrali danych (używając pamięci a) RAM16x?S, b)
RAMB16_S?).
4. Zaprojektuj układ zapisujący (i później odczytujący) konkretną wartość pod konkretną
lokację adresową (używając pamięci a) RAM16x?S, b) RAMB16_S?).
5. Używając pamięci dwuportowej RAMB16_S?_S? zaprojektuj układ zapisujący (i później
odczytujący) konkretną wartość pod konkretną lokację adresową na dwóch portach.
Zaobserwuj co się stanie w przypadku zapisu i odczytu spod tego samego adresu równocześnie
na dwóch portach.
Interface DDR
Ważne okno czasowe
Literatura:
Qimonda GDDR5 – White Paper, www.qimonda.com
Szybkość transferu
GDDR5
GDDR5 – inwersja bitów
GDDR – I/O
GDDR5 SGRAMs offer several features that let the controller perfectly adapt the device’s input
and output characteristics to the actual system impedance and thus improve the data eye for a
reliable data transmission.
•Auto calibration for process, voltage and temperature drift compensation
•Software controlled adjustable drive strengths
•Software controlled adjustable data, address and command termination impedances
•Software controlled adjustable data input reference voltage